@thejoseki/clawform 2.2.0 → 2.3.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.
- package/README.md +120 -95
- package/package.json +65 -63
- package/src/lib/license.js +6 -2
package/README.md
CHANGED
|
@@ -1,95 +1,120 @@
|
|
|
1
|
-
# Clawform
|
|
2
|
-
|
|
3
|
-
**Safe CloudFormation workflows for Claude Code.**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
#
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
#
|
|
44
|
-
#
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
#
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
1
|
+
# Clawform
|
|
2
|
+
|
|
3
|
+
**Safe CloudFormation workflows for Claude Code.**
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
Claude writes CloudFormation fast — and just as confidently when it's wrong.
|
|
8
|
+
Clawform is the layer between the agent and your AWS account.
|
|
9
|
+
|
|
10
|
+
It gives Claude the conventions to read before it writes, so templates come out
|
|
11
|
+
named to your standard, tagged, and with retention set on every stateful
|
|
12
|
+
resource. Every AWS change then goes through the `clawform` CLI: create a
|
|
13
|
+
changeset, show you the diff, execute only after you confirm. Destructive
|
|
14
|
+
operations and the stacks you've marked frozen are refused.
|
|
15
|
+
|
|
16
|
+
CloudFormation only — by design. Not Terraform, not CDK, not Pulumi.
|
|
17
|
+
|
|
18
|
+
**Try it free for 14 days** — the full kit, email-only checkout, no card:
|
|
19
|
+
<https://clawform.thejoseki.com>. When the trial lapses, `deploy` and
|
|
20
|
+
`rollback` keep working; an expired licence never strands a stack.
|
|
21
|
+
|
|
22
|
+
## Quickstart (10 minutes)
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# 1. Install the CLI (adds `clawform` to your PATH)
|
|
26
|
+
npm i -g @thejoseki/clawform
|
|
27
|
+
|
|
28
|
+
# 2. Activate your key — free 14-day trial or purchase, both from the site
|
|
29
|
+
clawform activate <your-license-key>
|
|
30
|
+
|
|
31
|
+
# 3. Install the Claude Code plugin — the CLI unpacks it from your activated copy
|
|
32
|
+
clawform init plugin # --global (default) or --project
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Activation claims one of your seat's device slots; free one with
|
|
36
|
+
`clawform deactivate` when you retire a machine. **In CI, do not activate** —
|
|
37
|
+
set `CLAWFORM_LICENSE_KEY` in the environment instead, which validates per-run
|
|
38
|
+
without taking a slot.
|
|
39
|
+
|
|
40
|
+
Then, **in your own project**:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# 4. Create your config — customer, region, accounts, legacy prefixes
|
|
44
|
+
clawform init # interactive wizard, writes clawform.config.json
|
|
45
|
+
|
|
46
|
+
# 5. Point Clawform at your AWS profile (per-user, gitignored)
|
|
47
|
+
# .claude/settings.local.json → env block → AWS_PROFILE
|
|
48
|
+
|
|
49
|
+
# 6. Cache your account's stacks and exports (run before your first deploy,
|
|
50
|
+
# and after every successful one)
|
|
51
|
+
clawform sync
|
|
52
|
+
|
|
53
|
+
# 7. Open Claude Code and scaffold your first stack
|
|
54
|
+
claude
|
|
55
|
+
> /clawform:scaffold-project # propose architecture + deploy order
|
|
56
|
+
> /clawform:new-stack networking d
|
|
57
|
+
> /clawform:validate cfn/d-acme-networking.yaml
|
|
58
|
+
> /clawform:deploy cfn/d-acme-networking.yaml d
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
That's a real stack, deployed through a changeset you confirmed.
|
|
62
|
+
|
|
63
|
+
### Don't know which services you need?
|
|
64
|
+
|
|
65
|
+
`/clawform:scaffold-project` detects that case and asks a different set of questions —
|
|
66
|
+
about consequences rather than services. *"If this were down for two hours on a Sunday
|
|
67
|
+
night, would anyone lose money?"* rather than *"Fargate or Lambda?"* Every question has an
|
|
68
|
+
**"I'm not sure"** option that states the default it applies and what that default costs.
|
|
69
|
+
|
|
70
|
+
Your monthly spending ceiling is the first question, and it eliminates candidate
|
|
71
|
+
architectures **before** any design work — so you never spend half an hour agreeing to
|
|
72
|
+
something you cannot pay for. Nothing is priced from memory: figures come from the AWS
|
|
73
|
+
Pricing API, and if one cannot be fetched you are told so instead of being given a guess.
|
|
74
|
+
|
|
75
|
+
The interview runs in at most three rounds and its answers are written to
|
|
76
|
+
`docs/scaffold/*.json`, so an interrupted session resumes where it stopped rather than
|
|
77
|
+
starting over. **Those files are committed** — that is what makes the design reviewable in
|
|
78
|
+
a pull request — and `requirements.json` contains your spending ceiling and a
|
|
79
|
+
plain-language description of what you are building. On a public repository, decide
|
|
80
|
+
whether you want that before you push.
|
|
81
|
+
|
|
82
|
+
## Configuration
|
|
83
|
+
|
|
84
|
+
Clawform reads two files. Neither hardcodes anything about your organization.
|
|
85
|
+
|
|
86
|
+
| File | Scope | Committed? | Holds |
|
|
87
|
+
|---|---|---|---|
|
|
88
|
+
| `clawform.config.json` | per-project | yes | customer, region, accounts, `legacy_prefixes` |
|
|
89
|
+
| `.claude/settings.local.json` | per-user | no (gitignored) | `AWS_PROFILE`, owner/cost-center overrides |
|
|
90
|
+
|
|
91
|
+
`clawform init` writes the first one. For CI or scripted bootstrap, set
|
|
92
|
+
`CLAWFORM_INIT_CUSTOMER=… CLAWFORM_INIT_REGION=… clawform init`.
|
|
93
|
+
|
|
94
|
+
A fresh project with an empty `legacy_prefixes` has no legacy-freeze gate — that
|
|
95
|
+
is correct. Clawform never imposes another project's freeze list on you.
|
|
96
|
+
|
|
97
|
+
## Requirements
|
|
98
|
+
|
|
99
|
+
- Node.js ≥ 20 LTS
|
|
100
|
+
- AWS CLI v2
|
|
101
|
+
- Claude Code CLI
|
|
102
|
+
- *(recommended)* `cfn-lint` — `pip install cfn-lint`
|
|
103
|
+
- *(optional)* `cfn-guard` 3.x for Clawform's custom rules
|
|
104
|
+
|
|
105
|
+
## Links
|
|
106
|
+
|
|
107
|
+
- **[clawform.thejoseki.com](https://clawform.thejoseki.com)** — the product
|
|
108
|
+
page: what Clawform does, per-seat pricing, and how to get a license.
|
|
109
|
+
- **[thejoseki.com](https://thejoseki.com)** — Joseki, the vendor behind
|
|
110
|
+
Clawform. Known-good moves for agentic work.
|
|
111
|
+
|
|
112
|
+
## License
|
|
113
|
+
|
|
114
|
+
Commercial, per-seat. One seat per developer; no resale or redistribution.
|
|
115
|
+
Provided **as is**, with no warranty and no liability for AWS charges — you are
|
|
116
|
+
responsible for reviewing every change before it deploys and for your own cloud
|
|
117
|
+
spend. Full terms in the `LICENSE` file.
|
|
118
|
+
|
|
119
|
+
Clawform is not affiliated with Amazon Web Services, Inc. "AWS" and
|
|
120
|
+
"CloudFormation" are trademarks of Amazon.com, Inc. or its affiliates.
|
package/package.json
CHANGED
|
@@ -1,63 +1,65 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@thejoseki/clawform",
|
|
3
|
-
"version": "2.
|
|
4
|
-
"description": "Clawform — safe CloudFormation workflows for Claude Code",
|
|
5
|
-
"homepage": "https://clawform.thejoseki.com",
|
|
6
|
-
"type": "module",
|
|
7
|
-
"license": "SEE LICENSE IN LICENSE",
|
|
8
|
-
"author": "Joseki <support@thejoseki.com>",
|
|
9
|
-
"publishConfig": {
|
|
10
|
-
"access": "public"
|
|
11
|
-
},
|
|
12
|
-
"bin": {
|
|
13
|
-
"clawform": "bin/clawform.js"
|
|
14
|
-
},
|
|
15
|
-
"engines": {
|
|
16
|
-
"node": ">=20.10"
|
|
17
|
-
},
|
|
18
|
-
"scripts": {
|
|
19
|
-
"test": "vitest run",
|
|
20
|
-
"test:watch": "vitest",
|
|
21
|
-
"test:eval": "vitest run tests/eval",
|
|
22
|
-
"lint": "node scripts/lint-content.js",
|
|
23
|
-
"package": "node scripts/package-plugin.js && node scripts/pack-payload.js",
|
|
24
|
-
"kit:build": "node scripts/package-plugin.js && node scripts/build-kit-worker.js",
|
|
25
|
-
"kit:deploy": "npm run kit:build && npm --prefix services/kit-worker run deploy",
|
|
26
|
-
"prepublishOnly": "node scripts/check-release-mode.js && npm run package",
|
|
27
|
-
"clean-room": "node scripts/clean-room.js",
|
|
28
|
-
"e2e": "node scripts/e2e-licensed-install.js",
|
|
29
|
-
"e2e:trial": "node scripts/e2e-trial.js"
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
"@aws-sdk/client-
|
|
34
|
-
"@aws-sdk/client-
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
|
|
63
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "@thejoseki/clawform",
|
|
3
|
+
"version": "2.3.0",
|
|
4
|
+
"description": "Clawform — safe CloudFormation workflows for Claude Code",
|
|
5
|
+
"homepage": "https://clawform.thejoseki.com",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
8
|
+
"author": "Joseki <support@thejoseki.com>",
|
|
9
|
+
"publishConfig": {
|
|
10
|
+
"access": "public"
|
|
11
|
+
},
|
|
12
|
+
"bin": {
|
|
13
|
+
"clawform": "bin/clawform.js"
|
|
14
|
+
},
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=20.10"
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"test": "vitest run",
|
|
20
|
+
"test:watch": "vitest",
|
|
21
|
+
"test:eval": "vitest run tests/eval",
|
|
22
|
+
"lint": "node scripts/lint-content.js",
|
|
23
|
+
"package": "node scripts/package-plugin.js && node scripts/pack-payload.js",
|
|
24
|
+
"kit:build": "node scripts/package-plugin.js && node scripts/build-kit-worker.js",
|
|
25
|
+
"kit:deploy": "npm run kit:build && npm --prefix services/kit-worker run deploy",
|
|
26
|
+
"prepublishOnly": "node scripts/check-release-mode.js && npm run package",
|
|
27
|
+
"clean-room": "node scripts/clean-room.js",
|
|
28
|
+
"e2e": "node scripts/e2e-licensed-install.js",
|
|
29
|
+
"e2e:trial": "node scripts/e2e-trial.js",
|
|
30
|
+
"test:coverage": "vitest run --coverage --coverage.reporter=text-summary --coverage.include=\"**/*.js\" --coverage.exclude=\"tests/**\" --coverage.exclude=\"skills/**\""
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@aws-sdk/client-cloudformation": "^3.700.0",
|
|
34
|
+
"@aws-sdk/client-cost-explorer": "^3.1066.0",
|
|
35
|
+
"@aws-sdk/client-sts": "^3.700.0",
|
|
36
|
+
"chalk": "^5.3.0",
|
|
37
|
+
"commander": "^12.1.0",
|
|
38
|
+
"diff": "^7.0.0",
|
|
39
|
+
"execa": "^9.5.0",
|
|
40
|
+
"inquirer": "^12.0.0",
|
|
41
|
+
"js-yaml": "^4.1.0"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@vitest/coverage-v8": "^2.1.9",
|
|
45
|
+
"vitest": "^2.1.9"
|
|
46
|
+
},
|
|
47
|
+
"files": [
|
|
48
|
+
"bin/",
|
|
49
|
+
"src/"
|
|
50
|
+
],
|
|
51
|
+
"keywords": [
|
|
52
|
+
"claude-code",
|
|
53
|
+
"claude",
|
|
54
|
+
"cloudformation",
|
|
55
|
+
"aws",
|
|
56
|
+
"iac",
|
|
57
|
+
"infrastructure-as-code",
|
|
58
|
+
"aws-cdk-alternative",
|
|
59
|
+
"changeset",
|
|
60
|
+
"cfn-lint",
|
|
61
|
+
"devops",
|
|
62
|
+
"guardrails",
|
|
63
|
+
"ai-agent"
|
|
64
|
+
]
|
|
65
|
+
}
|
package/src/lib/license.js
CHANGED
|
@@ -68,8 +68,12 @@ export async function assertLicensed({
|
|
|
68
68
|
const record = readLicense();
|
|
69
69
|
if (record.status !== 'active' || !record.key) {
|
|
70
70
|
throw new Error(
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
// The one message every npm installer without a key will read — the only
|
|
72
|
+
// audience the product reliably has. It leads with the door that costs
|
|
73
|
+
// nothing, then the one for a key already bought.
|
|
74
|
+
`'clawform ${command}' needs an activated license. ` +
|
|
75
|
+
'New here? There is a free 14-day trial — full kit, no card — at https://clawform.thejoseki.com. ' +
|
|
76
|
+
'Already have a key (trial or purchase email)? Run: clawform activate <key>',
|
|
73
77
|
);
|
|
74
78
|
}
|
|
75
79
|
|