Skip to content

Commit 59b5232

Browse files
feat(cli): add AgenticCheck construct (#1268)
* feat(cli): add AgenticCheck construct for AI-powered monitoring Adds the AgenticCheck construct that lets users define agentic checks in their Checkly project via checkly.config.ts. Agentic checks use a prompt string (no scripts/bundling) to define what the AI agent should verify. - Add AGENTIC to CheckTypes enum - Create AgenticCheck extending Check (not RuntimeCheck) - Validate prompt (required, max 10000 chars) and frequency (min 30) - Add construct export and analytics mapping - Add 6 tests covering synthesis, defaults, groups, and validation Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(cli): force runParallel for agentic checks Agentic checks always run in parallel for better reporting UX. The construct omits runParallel from props (users can't override it) and hardcodes it to true in synthesize(). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Revert "feat(cli): force runParallel for agentic checks" This reverts commit a77f117. * feat(cli): restrict AgenticCheck props to platform-supported fields Lock down AgenticCheckProps to only the subset of CheckProps the Checkly platform currently honors for agentic checks. Omits locations, privateLocations, runParallel, retryStrategy, shouldFail, doubleCheck, triggerIncident and groupId at the type level, and restricts frequency to the discrete set exposed in the webapp builder. Defensive overrides in the constructor ensure project-level config defaults for any of these fields are also ignored, so the construct never claims to support what the platform won't honor. These restrictions can be relaxed additively (without breaking changes) once the platform supports the corresponding capabilities for agentic checks. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(cli): add agentRuntime to AgenticCheck for skills and env var access Adds an `agentRuntime` prop to AgenticCheck that declares the runtime context the agent has access to during execution: which skills it can use and which environment variables it is permitted to read. agentRuntime is the explicit security boundary for the agent. Anything not declared here is unavailable at runtime, which keeps the blast radius of any prompt injection as small as possible. Environment variables accept either bare names or `{ name, description }` objects; descriptions are passed to the agent so it can decide when to read each variable, and are validated to stay within the runner's 200-char limit. The construct always synthesizes a complete agentRuntime payload (with empty arrays when unset), so the backend has unambiguous source-of-truth semantics: omitted skills/env vars mean "the agent should not have them", not "preserve whatever was there before". The backend translates this clean shape into the existing agenticCheckData storage blob. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(cli): add code generation support for AgenticCheck Wires AgenticCheck into the \`checkly import\` code generation flow so users can import an existing agentic check from the backend and get a construct file that matches the locked-down props type added earlier on this branch. Implementation: - New \`AgenticCheckCodegen\` in \`agentic-check-codegen.ts\` mirroring the Heartbeat/Browser codegen pattern. Places generated files under \`resources/agentic-checks/{name}\`, imports \`AgenticCheck\` from \`checkly/constructs\`, and emits a \`new AgenticCheck(...)\` expression. - The resource shape (\`AgenticCheckResource\`) carries \`prompt\` and the backend's \`agenticCheckData\` storage blob. A small helper reverse- translates that blob into the CLI construct's public shape: * \`agenticCheckData.skills\` → \`agentRuntime.skills\` * \`agenticCheckData.selectedEnvironmentVariables\` → \`agentRuntime.environmentVariables\` — mapping \`key\` back to \`name\` for object-form entries * \`agenticCheckData.assertionRules\` → deliberately not emitted (agent-generated, preserved server-side via the backend's merge logic, the construct intentionally does not expose them) An imported check with no skills and no selected env vars produces no \`agentRuntime\` block at all, to avoid noise in the generated code. - Registers the new codegen in \`CheckCodegen.constructor\` and wires \`AGENTIC\` into the dispatch switches in \`describe()\` and \`gencode()\` alongside the existing check types. \`buildCheckProps\` gains a narrow \`BuildCheckPropsOptions\` parameter — currently a single \`skipRetryStrategy\` flag — because \`retryStrategy\` is the only field that \`buildCheckProps\` emits unconditionally (null is rendered as \`RetryStrategyBuilder.noRetries()\`). The AgenticCheck construct's props type omits \`retryStrategy\` entirely, so emitting it would produce a generated file that does not type-check. The AgenticCheckCodegen passes \`skipRetryStrategy: true\` and clears \`locations\` from a resource copy before calling \`buildCheckProps\` — the two fixes together make the generated output round-trip cleanly through the construct's props type. Verified end-to-end by extending \`ai-context/context.fixtures.json\` with an example agentic check (prompt, skills, mixed-form env vars, sample assertionRules) and running \`npm run prepare:ai-context\`. The generated \`gen/resources/agentic-checks/example-agentic-check.check.ts\` contains only fields the construct accepts, reverse-translates env vars from \`key\` to \`name\`, omits \`assertionRules\`, and type-checks against the construct. Full CLI suite remains green (829 passing / 2 skipped / 60 files). No regressions in any other check type's codegen from the new optional options parameter. Covers item #3 on Simo's new-construct checklist. Items #5 (examples), #6 (E2E tests), and #8 (AI context reference doc) still pending on this branch. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test(cli): add unit tests for AgenticCheckCodegen Cover the codegen edge cases that the `prepare:ai-context` happy-path fixture doesn't exercise: missing/null/empty `agenticCheckData`, skills-only, env vars-only, mixed bare-string and object-form env var entries, the `key` -> `name` reverse translation, and the explicit suppression of `locations`, `retryStrategy`, and `assertionRules` from the generated source. Also drop a few defensive runtime checks in the codegen that the typed `StoredAgenticCheckData` interface already guarantees, and trim a comment block in `gencode()`. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs(cli): add AgenticCheck examples for AI context and boilerplate - Add an `AGENTIC_CHECK` entry to `EXAMPLE_CONFIGS` so the `prepare:ai-context` pipeline can interpolate the generated example into reference docs. - Simplify the `example-agentic-check` fixture to a single self-contained pricing-page check (no skills, no env vars). The unit tests added in the previous commit cover the more complex agentRuntime cases. - Add an `agentic.check.ts` (and the JS twin) to the boilerplate project so first-time CLI users see what an agentic check looks like alongside the existing API/URL/heartbeat examples. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test(cli): add e2e deploy round-trip for AgenticCheck Adds a `deploy-agentic-project` fixture that exercises both the plain-prompt form and the `agentRuntime` form, plus a corresponding `describe('deploy-agentic-project', ...)` block in `deploy.spec.ts`. The tests cover two scenarios: 1. `--preview` produces an import plan that lists both agentic checks under the `Create:` heading, exercising the codegen + deploy planner path without leaving any state behind. 2. `--force` actually creates the checks on the target account and reads them back via the public REST API to confirm that `checkType`, the hardcoded `us-east-1` location, and round-tripped tags all land correctly. Both tests require the e2e CI account to be entitled to agentic checks. If the account is not entitled, the tests will fail with a 402 — that's the signal to enable the entitlement, not to weaken the test. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs(cli): add Agentic Check reference for the AI skill - Add `configure-agentic-checks` to the `REFERENCES` array so the `npx checkly skills` command and the generated `checkly.rules.md` expose the new construct alongside the other check types. - Add `configure-agentic-checks.md` covering the locked-down props, the restricted frequency set, the `agentRuntime` security boundary, the prompt-writing guidance, and the assertion-rules round-trip rules. The example is interpolated from `EXAMPLE_CONFIGS.AGENTIC_CHECK`. - Mention agentic checks in the `skill.md` frontmatter description so agents discover the construct from the skill summary alone. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: regen ai context and fix NO_RETRIES * docs(cli): correct AgenticCheck skill installation guidance Skills declared on `agentRuntime.skills` are installed on the runner via `npx skills add <entry>` (https://skills.sh), not via the `npx checkly skills install` meta-skill installer that ships the SKILL.md file into a project. The previous JSDoc, reference doc, and example fixtures conflated the two. Updates: - `agentic-check.ts`: rewrite the `AgentRuntime.skills` JSDoc to describe the real installation path, list the three identifier forms skills.sh accepts (full URL, owner/repo, plain name), and note that the runner preloads the `playwright-cli` skill so users only need to declare extras. - `configure-agentic-checks.md`: same correction in the AI reference doc, with the example block expanded to show all three forms. - Test/example fixtures: switch the placeholder skill from the non-existent `'checkly/playwright-skill'` to `'addyosmani/web-quality-skills'` to make it visible that third-party skills published to skills.sh work — not just Checkly's own. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ci: temporary debug step to fingerprint the e2e Checkly account Adds a debug step before `npm run test:e2e` (ubuntu only) that prints SHA-256 hashes of the secret account ID/name plus a few non-secret fields from `/next/accounts/<id>` and `/v1/accounts/me/entitlements`. The hashes let us verify which account the secrets resolve to without leaking the actual values in this public repo's CI logs. The entitlement block shows whether `maxAgenticChecks` bumps are landing on the account the e2e tests actually use, and the existing-AGENTIC count surfaces stale orphans that may be eating the budget. Compare locally with: node -e "console.log(require('crypto').createHash('sha256') \\ .update('<candidate-id-or-name>').digest('hex'))" To remove once the right account is confirmed. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ci: remove temporary e2e account fingerprint debug step The fingerprint did its job — it surfaced that the secrets pointed at an account different from the one being bumped, and that the target account's `maxAgenticChecks` column was unset (the `add_agentic_check_quota_columns` migration only seeded HOBBY, STARTER, TEAM and TRIAL plan accounts, leaving CONTRACT plan rows with NULL). The right account has been bumped and the e2e tests should pass on the next run. Reverting the workflow back to its previous shape. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor(cli): rename agentRuntime.environmentVariables to exposeEnvironmentVariables Makes the allowlist semantics explicit — these are the env vars the agent is permitted to read, not the variables themselves. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 53bbce0 commit 59b5232

39 files changed

Lines changed: 1532 additions & 3 deletions

File tree

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
const { AgenticCheck } = require('checkly/constructs')
2+
3+
// Agentic checks are AI-powered: instead of writing code, you describe what
4+
// the check should do in natural language and the agent figures out how.
5+
// Read more at: https://www.checklyhq.com/docs/agentic-checks/
6+
7+
new AgenticCheck('checkly-pricing-page', {
8+
name: 'Checkly pricing page',
9+
prompt:
10+
'Navigate to https://www.checklyhq.com/pricing and verify that at least three plan tiers are displayed on the page.',
11+
// Agentic checks currently run from a single location and follow their own
12+
// frequency cadence (30, 60, 120, 180, 360, 720 or 1440 minutes). The
13+
// construct hardcodes the location and validates the frequency for you.
14+
frequency: 60,
15+
})
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { AgenticCheck } from 'checkly/constructs'
2+
3+
// Agentic checks are AI-powered: instead of writing code, you describe what
4+
// the check should do in natural language and the agent figures out how.
5+
// Read more at: https://www.checklyhq.com/docs/agentic-checks/
6+
7+
new AgenticCheck('checkly-pricing-page', {
8+
name: 'Checkly pricing page',
9+
prompt:
10+
'Navigate to https://www.checklyhq.com/pricing and verify that at least three plan tiers are displayed on the page.',
11+
// Agentic checks currently run from a single location and follow their own
12+
// frequency cadence (30, 60, 120, 180, 360, 720 or 1440 minutes). The
13+
// construct hardcodes the location and validates the frequency for you.
14+
frequency: 60,
15+
})

packages/cli/e2e/__tests__/deploy.spec.ts

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,69 @@ describe('deploy', { timeout: 45_000 }, () => {
261261
})
262262
})
263263

264+
describe('deploy-agentic-project', () => {
265+
let fixt: FixtureSandbox
266+
267+
beforeAll(async () => {
268+
fixt = await FixtureSandbox.create({
269+
source: path.join(__dirname, 'fixtures', 'deploy-agentic-project'),
270+
})
271+
}, 180_000)
272+
273+
afterAll(async () => {
274+
await fixt?.destroy()
275+
})
276+
277+
it('Should preview an agentic check deployment', async () => {
278+
// Use --preview so the test doesn't depend on the e2e account being
279+
// entitled to actually create agentic checks. The plan still goes
280+
// through full server-side validation, so we get coverage of the
281+
// deploy round-trip without leaving resources behind.
282+
const { stdout } = await runDeploy(fixt, ['--preview'], {
283+
env: {
284+
PROJECT_LOGICAL_ID: projectLogicalId,
285+
PRIVATE_LOCATION_SLUG_NAME: privateLocationSlugname,
286+
CHECKLY_CLI_VERSION: undefined,
287+
},
288+
})
289+
290+
expect(stdout).toContain(
291+
`Create:
292+
AgenticCheck: agentic-pricing-check
293+
AgenticCheck: agentic-runtime-check
294+
`)
295+
})
296+
297+
it('Should deploy and re-read an agentic check', async () => {
298+
const { stderr, stdout } = await runDeploy(fixt, ['--force'], {
299+
env: {
300+
PROJECT_LOGICAL_ID: projectLogicalId,
301+
PRIVATE_LOCATION_SLUG_NAME: privateLocationSlugname,
302+
CHECKLY_CLI_VERSION: undefined,
303+
},
304+
})
305+
306+
expect(stderr).toBe('')
307+
expect(stdout).not.toContain('Notice: replacing version')
308+
309+
const checks = await getAllResources('checks')
310+
const pricingCheck = checks.find(({ name }: { name: string }) =>
311+
name === 'Agentic Pricing Check')
312+
const runtimeCheck = checks.find(({ name }: { name: string }) =>
313+
name === 'Agentic Runtime Check')
314+
315+
expect(pricingCheck).toBeDefined()
316+
expect(pricingCheck.checkType).toEqual('AGENTIC')
317+
// The construct hardcodes a single location for agentic checks.
318+
expect(pricingCheck.locations).toEqual(['us-east-1'])
319+
expect(pricingCheck.tags).toEqual(expect.arrayContaining(['e2e', 'agentic']))
320+
321+
expect(runtimeCheck).toBeDefined()
322+
expect(runtimeCheck.checkType).toEqual('AGENTIC')
323+
expect(runtimeCheck.locations).toEqual(['us-east-1'])
324+
})
325+
})
326+
264327
describe('test-only-project', () => {
265328
let fixt: FixtureSandbox
266329

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/* eslint-disable */
2+
import { AgenticCheck, Frequency } from 'checkly/constructs'
3+
4+
new AgenticCheck('agentic-pricing-check', {
5+
name: 'Agentic Pricing Check',
6+
prompt:
7+
'Navigate to https://www.checklyhq.com/pricing and verify that at least three plan tiers are displayed on the page.',
8+
activated: false,
9+
muted: true,
10+
frequency: Frequency.EVERY_1H,
11+
tags: ['e2e', 'agentic'],
12+
})
13+
14+
new AgenticCheck('agentic-runtime-check', {
15+
name: 'Agentic Runtime Check',
16+
prompt:
17+
'Navigate to https://www.checklyhq.com and verify the homepage loads with the main heading visible.',
18+
activated: false,
19+
muted: true,
20+
frequency: 60,
21+
agentRuntime: {
22+
skills: ['addyosmani/web-quality-skills'],
23+
exposeEnvironmentVariables: [
24+
'ENVIRONMENT_URL',
25+
{ name: 'TEST_USER_EMAIL', description: 'Login email for the test account' },
26+
],
27+
},
28+
})
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
const config = {
2+
projectName: 'Deploy Agentic Project',
3+
logicalId: process.env.PROJECT_LOGICAL_ID,
4+
repoUrl: 'https://github.com/checkly/checkly-cli',
5+
}
6+
export default config
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"name": "project",
3+
"version": "1.0.0",
4+
"dependencies": {
5+
"jiti": "^2.6.1"
6+
}
7+
}

packages/cli/src/ai-context/context.fixtures.json

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -824,6 +824,63 @@
824824
"privateLocations": []
825825
}
826826
},
827+
{
828+
"logicalId": "example-agentic-check",
829+
"physicalId": "dddddddd-dddd-dddd-dddd-dddddddddddd",
830+
"type": "check",
831+
"member": true,
832+
"pending": true,
833+
"payload": {
834+
"id": "dddddddd-dddd-dddd-dddd-dddddddddddd",
835+
"checkType": "AGENTIC",
836+
"name": "Example Agentic Check",
837+
"frequency": 60,
838+
"frequencyOffset": 0,
839+
"activated": true,
840+
"muted": false,
841+
"shouldFail": false,
842+
"locations": [
843+
"us-east-1"
844+
],
845+
"accountId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
846+
"created_at": "2025-10-28T17:25:17.037Z",
847+
"updated_at": null,
848+
"tags": [
849+
"app:webshop"
850+
],
851+
"alertSettings": {
852+
"reminders": {
853+
"amount": 0,
854+
"interval": 5
855+
},
856+
"escalationType": "RUN_BASED",
857+
"runBasedEscalation": {
858+
"failedRunThreshold": 1
859+
},
860+
"timeBasedEscalation": {
861+
"minutesFailingThreshold": 5
862+
},
863+
"parallelRunFailureThreshold": {
864+
"enabled": false,
865+
"percentage": 10
866+
}
867+
},
868+
"useGlobalAlertSettings": true,
869+
"groupId": null,
870+
"groupOrder": null,
871+
"retryStrategy": null,
872+
"runParallel": false,
873+
"triggerIncident": false,
874+
"prompt": "Navigate to https://www.checklyhq.com/pricing and verify that at least three plan tiers are displayed on the page.",
875+
"agenticCheckData": {
876+
"skills": [],
877+
"selectedEnvironmentVariables": [],
878+
"assertionRules": []
879+
},
880+
"alertChannelSubscriptions": [],
881+
"privateLocations": []
882+
}
883+
},
827884
{
828885
"logicalId": "example-maintenance-window",
829886
"physicalId": 1000001,

packages/cli/src/ai-context/context.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
export const REFERENCES = [
2+
{
3+
id: 'configure-agentic-checks',
4+
description: 'Agentic Check construct (`AgenticCheck`) for AI-powered prompt-driven monitoring with skill and env var allowlists',
5+
},
26
{
37
id: 'configure-api-checks',
48
description: 'Api Check construct (`ApiCheck`), assertions, and authentication setup scripts',
@@ -147,6 +151,11 @@ export default defineConfig({
147151
`,
148152
reference: 'https://www.checklyhq.com/docs/constructs/project/',
149153
},
154+
AGENTIC_CHECK: {
155+
templateString: '<!-- EXAMPLE: AGENTIC_CHECK -->',
156+
exampleConfigPath: 'resources/agentic-checks/example-agentic-check.check.ts',
157+
reference: 'https://www.checklyhq.com/docs/constructs/agentic-check/',
158+
},
150159
BROWSER_CHECK: {
151160
templateString: '<!-- EXAMPLE: BROWSER_CHECK -->',
152161
exampleConfigPath:
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# Agentic Checks
2+
3+
- Import the `AgenticCheck` construct from `checkly/constructs`.
4+
- Agentic checks are AI-powered: instead of writing code, you describe what the check should do in natural language with the `prompt` property. The agent decides how to satisfy the prompt at runtime.
5+
- Write prompts as concrete imperative steps, not vague goals. Tell the agent which URL to navigate to and what specific signals confirm success — for example, "Navigate to https://example.com/pricing and verify that at least three plan tiers are displayed", not "Check that pricing works".
6+
- Keep prompts under 10000 characters. The construct will fail validation otherwise.
7+
- **Frequency is restricted.** Only `30`, `60`, `120`, `180`, `360`, `720`, or `1440` minutes are accepted (matching `Frequency.EVERY_30M`, `EVERY_1H`, `EVERY_2H`, `EVERY_3H`, `EVERY_6H`, `EVERY_12H`, `EVERY_24H`). Anything else fails validation.
8+
- **Locations are not configurable.** Agentic checks currently run from a single fixed location. The construct hardcodes it — do not pass `locations` or `privateLocations`.
9+
- **Several common check fields are intentionally omitted** from `AgenticCheckProps`: `runParallel`, `retryStrategy`, `shouldFail`, `doubleCheck`, `triggerIncident`, and `groupId`. The platform does not yet honor these for agentic checks. Setting them in the construct is a TypeScript error.
10+
- **Important:** The target URL must be publicly accessible. Checks run on Checkly's cloud infrastructure, not locally. If the user is developing against localhost, suggest a tunneling tool (ngrok, cloudflare tunnel) or a preview/staging deployment.
11+
- **Plan-gated:** Agentic checks require the `AGENTIC_CHECKS` entitlement on the account. Run `npx checkly skills manage` to check entitlements before using.
12+
13+
## `agentRuntime` — security boundary for skills and env vars
14+
15+
`agentRuntime` is the explicit allowlist of resources the agent may use at execution time. Anything not declared in `agentRuntime` is **unavailable** to the agent. Treat it as a security boundary: the smaller the runtime surface, the smaller the blast radius of any prompt injection.
16+
17+
```typescript
18+
agentRuntime: {
19+
// Additional skills to load on top of the runner's defaults (the
20+
// `playwright-cli` skill is preloaded automatically — you don't need
21+
// to declare it). Each entry is passed verbatim to `npx skills add`
22+
// on the runner, so any third-party skill published to https://skills.sh
23+
// works — not just Checkly's own. Supported identifier forms:
24+
// - full URL form: 'https://skills.sh/microsoft/playwright-cli/playwright-cli'
25+
// - owner/repo form: 'addyosmani/web-quality-skills'
26+
// - plain name: 'cost-optimization'
27+
skills: ['addyosmani/web-quality-skills'],
28+
29+
// Environment variables the agent is allowed to read at runtime.
30+
// Anything not listed here is hidden from the agent process — even
31+
// if it's defined at the project or check level.
32+
exposeEnvironmentVariables: [
33+
// Bare string form: variable name only.
34+
'ENVIRONMENT_URL',
35+
// Object form: pair the variable with a description so the agent
36+
// can decide when to read it. Descriptions are passed to the model
37+
// and are truncated to 200 characters.
38+
{ name: 'TEST_USER_EMAIL', description: 'Login email for the test account' },
39+
],
40+
},
41+
```
42+
43+
- Only declare env vars the agent **needs**. Adding a variable to `exposeEnvironmentVariables` exposes it to the model and to anything the model invokes via skills.
44+
- Descriptions are not just documentation — they steer the model's decisions. Use them to disambiguate variables that have non-obvious names.
45+
- The runner installs each skill via `npx skills add` at the start of every check run. The CLI does not validate the skill identifier at deploy time, so a typo will not surface until the first run.
46+
- The `playwright-cli` skill is preloaded for every agentic check. Only declare additional skills here.
47+
48+
## Assertion rules
49+
50+
The agent generates its own assertion rules on the first successful run, and the platform persists them server-side. **The CLI construct does not expose assertion rules** — do not try to set them. They survive across deploys: importing an existing agentic check via `checkly import` will not surface them in the generated TypeScript, and a subsequent deploy of that file will not erase them on the backend.
51+
52+
<!-- EXAMPLE: AGENTIC_CHECK -->

packages/cli/src/ai-context/skill.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
name: checkly
3-
description: Set up, create, test and manage monitoring checks using the Checkly CLI. Use when working with API Checks, Browser Checks, URL Monitors, ICMP Monitors, Playwright Check Suites, Heartbeat Monitors, Alert Channels, Dashboards, or Status Pages.
3+
description: Set up, create, test and manage monitoring checks using the Checkly CLI. Use when working with Agentic Checks, API Checks, Browser Checks, URL Monitors, ICMP Monitors, Playwright Check Suites, Heartbeat Monitors, Alert Channels, Dashboards, or Status Pages.
44
allowed-tools: Bash(npx:checkly:*) Bash(npm:install:*)
55
metadata:
66
author: checkly

0 commit comments

Comments
 (0)