Rename continuous-learning plugin to continual-learning

Apply a full path and identifier rename for the plugin (folder, hooks, skill path, marketplace source, and docs) so installation and references consistently use continual-learning.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
ericzakariasson
2026-02-19 11:51:13 -05:00
parent 2cf89ae30b
commit 46c85c6e84
9 changed files with 46 additions and 32 deletions
+2 -2
View File
@@ -14,8 +14,8 @@
"description": "Skill mapping, practice plans, and learning retrospectives." "description": "Skill mapping, practice plans, and learning retrospectives."
}, },
{ {
"name": "continuous-learning", "name": "continual-learning",
"source": "continuous-learning", "source": "continual-learning",
"description": "Incremental transcript-driven memory updates for AGENTS.md using high-signal bullet points only." "description": "Incremental transcript-driven memory updates for AGENTS.md using high-signal bullet points only."
}, },
{ {
+1 -1
View File
@@ -7,7 +7,7 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc
| Plugin | Category | Description | | Plugin | Category | Description |
|:-------|:---------|:------------| |:-------|:---------|:------------|
| [Teaching](teaching/) | Utilities | Skill maps, practice plans, and feedback loops | | [Teaching](teaching/) | Utilities | Skill maps, practice plans, and feedback loops |
| [Continuous Learning](continuous-learning/) | Developer Tools | Incremental transcript-driven AGENTS.md memory updates with high-signal bullet points | | [Continual Learning](continual-learning/) | Developer Tools | Incremental transcript-driven AGENTS.md memory updates with high-signal bullet points |
| [Cursor Team Kit](cursor-team-kit/) | Developer Tools | Internal-style workflows for CI, code review, shipping, and testing | | [Cursor Team Kit](cursor-team-kit/) | Developer Tools | Internal-style workflows for CI, code review, shipping, and testing |
| [Create Plugin](create-plugin/) | Developer Tools | Meta workflows for creating Cursor plugins with scaffolding and submission checks | | [Create Plugin](create-plugin/) | Developer Tools | Meta workflows for creating Cursor plugins with scaffolding and submission checks |
| [Ralph Loop](ralph-loop/) | Developer Tools | Iterative self-referential AI loops using the Ralph Wiggum technique | | [Ralph Loop](ralph-loop/) | Developer Tools | Iterative self-referential AI loops using the Ralph Wiggum technique |
@@ -1,6 +1,6 @@
{ {
"name": "continuous-learning", "name": "continual-learning",
"displayName": "Continuous Learning", "displayName": "Continual Learning",
"version": "1.0.0", "version": "1.0.0",
"description": "Incrementally learns durable user preferences and workspace facts from transcript changes and keeps AGENTS.md up to date with plain bullet points.", "description": "Incrementally learns durable user preferences and workspace facts from transcript changes and keeps AGENTS.md up to date with plain bullet points.",
"author": { "author": {
@@ -12,7 +12,7 @@
"license": "MIT", "license": "MIT",
"logo": "assets/avatar.png", "logo": "assets/avatar.png",
"keywords": [ "keywords": [
"continuous-learning", "continual-learning",
"agent-memory", "agent-memory",
"transcripts", "transcripts",
"hooks", "hooks",
@@ -1,11 +1,11 @@
# Continuous Learning # Continual Learning
Automatically and incrementally keeps `AGENTS.md` up to date from transcript changes. Automatically and incrementally keeps `AGENTS.md` up to date from transcript changes.
The plugin combines: The plugin combines:
- A `stop` hook that decides when to trigger learning. - A `stop` hook that decides when to trigger learning.
- A `continuous-learning` skill that mines only high-signal transcript deltas. - A `continual-learning` skill that mines only high-signal transcript deltas.
It is designed to avoid noisy rewrites by: It is designed to avoid noisy rewrites by:
@@ -16,20 +16,20 @@ It is designed to avoid noisy rewrites by:
## Installation ## Installation
```bash ```bash
/add-plugin continuous-learning /add-plugin continual-learning
``` ```
## How it works ## How it works
On eligible `stop` events, the hook may emit a `followup_message` that asks the agent to run the `continuous-learning` skill. On eligible `stop` events, the hook may emit a `followup_message` that asks the agent to run the `continual-learning` skill.
The hook keeps local runtime state in: The hook keeps local runtime state in:
- `.cursor/hooks/state/continuous-learning.json` (cadence state) - `.cursor/hooks/state/continual-learning.json` (cadence state)
The skill uses an incremental transcript index at: The skill uses an incremental transcript index at:
- `.cursor/hooks/state/continuous-learning-index.json` - `.cursor/hooks/state/continual-learning-index.json`
## Trigger cadence ## Trigger cadence
@@ -47,12 +47,12 @@ Trial mode defaults (enabled in this plugin hook config):
## Optional env overrides ## Optional env overrides
- `CONTINUOUS_LEARNING_MIN_TURNS` - `CONTINUAL_LEARNING_MIN_TURNS` (or legacy `CONTINUOUS_LEARNING_MIN_TURNS`)
- `CONTINUOUS_LEARNING_MIN_MINUTES` - `CONTINUAL_LEARNING_MIN_MINUTES` (or legacy `CONTINUOUS_LEARNING_MIN_MINUTES`)
- `CONTINUOUS_LEARNING_TRIAL_MODE` - `CONTINUAL_LEARNING_TRIAL_MODE` (or legacy `CONTINUOUS_LEARNING_TRIAL_MODE`)
- `CONTINUOUS_LEARNING_TRIAL_MIN_TURNS` - `CONTINUAL_LEARNING_TRIAL_MIN_TURNS` (or legacy `CONTINUOUS_LEARNING_TRIAL_MIN_TURNS`)
- `CONTINUOUS_LEARNING_TRIAL_MIN_MINUTES` - `CONTINUAL_LEARNING_TRIAL_MIN_MINUTES` (or legacy `CONTINUOUS_LEARNING_TRIAL_MIN_MINUTES`)
- `CONTINUOUS_LEARNING_TRIAL_DURATION_MINUTES` - `CONTINUAL_LEARNING_TRIAL_DURATION_MINUTES` (or legacy `CONTINUOUS_LEARNING_TRIAL_DURATION_MINUTES`)
## Output format in AGENTS.md ## Output format in AGENTS.md

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 63 KiB

@@ -4,9 +4,9 @@ import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from "no
import { dirname, resolve } from "node:path"; import { dirname, resolve } from "node:path";
import { stdin } from "bun"; import { stdin } from "bun";
const STATE_PATH = resolve(".cursor/hooks/state/continuous-learning.json"); const STATE_PATH = resolve(".cursor/hooks/state/continual-learning.json");
const INCREMENTAL_INDEX_PATH = resolve( const INCREMENTAL_INDEX_PATH = resolve(
".cursor/hooks/state/continuous-learning-index.json" ".cursor/hooks/state/continual-learning-index.json"
); );
const DEFAULT_MIN_TURNS = 10; const DEFAULT_MIN_TURNS = 10;
const DEFAULT_MIN_MINUTES = 120; const DEFAULT_MIN_MINUTES = 120;
@@ -15,7 +15,7 @@ const TRIAL_DEFAULT_MIN_MINUTES = 15;
const TRIAL_DEFAULT_DURATION_MINUTES = 24 * 60; const TRIAL_DEFAULT_DURATION_MINUTES = 24 * 60;
const FOLLOWUP_MESSAGE = const FOLLOWUP_MESSAGE =
`Run the \`continuous-learning\` skill now. First read existing \`AGENTS.md\` and update existing entries in place (do not only append). Use incremental transcript processing with index file \`${INCREMENTAL_INDEX_PATH}\`: only read transcripts not in the index or transcripts whose mtime is newer than indexed mtime (re-read changed transcripts). After processing, write back the updated index mtimes and remove entries for deleted transcripts. Update \`AGENTS.md\` only for high-signal, repeated user-correction patterns or durable workspace facts. Exclude one-off/transient details and secrets. Keep each learned section to at most 12 bullets. Write plain bullet points only, with no evidence/confidence tags or other metadata annotations. If no meaningful updates exist, respond exactly: No high-signal memory updates.`; `Run the \`continual-learning\` skill now. First read existing \`AGENTS.md\` and update existing entries in place (do not only append). Use incremental transcript processing with index file \`${INCREMENTAL_INDEX_PATH}\`: only read transcripts not in the index or transcripts whose mtime is newer than indexed mtime (re-read changed transcripts). After processing, write back the updated index mtimes and remove entries for deleted transcripts. Update \`AGENTS.md\` only for high-signal, repeated user-correction patterns or durable workspace facts. Exclude one-off/transient details and secrets. Keep each learned section to at most 12 bullets. Write plain bullet points only, with no evidence/confidence tags or other metadata annotations. If no meaningful updates exist, respond exactly: No high-signal memory updates.`;
interface StopHookInput { interface StopHookInput {
conversation_id: string; conversation_id: string;
@@ -58,6 +58,10 @@ function parseBoolean(value: string | undefined): boolean {
); );
} }
function readEnvValue(primary: string, legacy: string): string | undefined {
return process.env[primary] ?? process.env[legacy];
}
function loadState(): ContinuousLearningState { function loadState(): ContinuousLearningState {
const fallback: ContinuousLearningState = { const fallback: ContinuousLearningState = {
version: 1, version: 1,
@@ -156,21 +160,31 @@ async function main(args: string[]): Promise<number> {
const now = Date.now(); const now = Date.now();
const trialEnabled = const trialEnabled =
args.includes("--trial") || parseBoolean(process.env.CONTINUOUS_LEARNING_TRIAL_MODE); args.includes("--trial") ||
parseBoolean(readEnvValue("CONTINUAL_LEARNING_TRIAL_MODE", "CONTINUOUS_LEARNING_TRIAL_MODE"));
if (trialEnabled && countedTurn && state.trialStartedAtMs === null) { if (trialEnabled && countedTurn && state.trialStartedAtMs === null) {
state.trialStartedAtMs = now; state.trialStartedAtMs = now;
} }
const trialDurationMinutes = parsePositiveInt( const trialDurationMinutes = parsePositiveInt(
process.env.CONTINUOUS_LEARNING_TRIAL_DURATION_MINUTES, readEnvValue(
"CONTINUAL_LEARNING_TRIAL_DURATION_MINUTES",
"CONTINUOUS_LEARNING_TRIAL_DURATION_MINUTES"
),
TRIAL_DEFAULT_DURATION_MINUTES TRIAL_DEFAULT_DURATION_MINUTES
); );
const trialMinTurns = parsePositiveInt( const trialMinTurns = parsePositiveInt(
process.env.CONTINUOUS_LEARNING_TRIAL_MIN_TURNS, readEnvValue(
"CONTINUAL_LEARNING_TRIAL_MIN_TURNS",
"CONTINUOUS_LEARNING_TRIAL_MIN_TURNS"
),
TRIAL_DEFAULT_MIN_TURNS TRIAL_DEFAULT_MIN_TURNS
); );
const trialMinMinutes = parsePositiveInt( const trialMinMinutes = parsePositiveInt(
process.env.CONTINUOUS_LEARNING_TRIAL_MIN_MINUTES, readEnvValue(
"CONTINUAL_LEARNING_TRIAL_MIN_MINUTES",
"CONTINUOUS_LEARNING_TRIAL_MIN_MINUTES"
),
TRIAL_DEFAULT_MIN_MINUTES TRIAL_DEFAULT_MIN_MINUTES
); );
const inTrialWindow = const inTrialWindow =
@@ -179,11 +193,11 @@ async function main(args: string[]): Promise<number> {
now - state.trialStartedAtMs < trialDurationMinutes * 60_000; now - state.trialStartedAtMs < trialDurationMinutes * 60_000;
const minTurns = parsePositiveInt( const minTurns = parsePositiveInt(
process.env.CONTINUOUS_LEARNING_MIN_TURNS, readEnvValue("CONTINUAL_LEARNING_MIN_TURNS", "CONTINUOUS_LEARNING_MIN_TURNS"),
DEFAULT_MIN_TURNS DEFAULT_MIN_TURNS
); );
const minMinutes = parsePositiveInt( const minMinutes = parsePositiveInt(
process.env.CONTINUOUS_LEARNING_MIN_MINUTES, readEnvValue("CONTINUAL_LEARNING_MIN_MINUTES", "CONTINUOUS_LEARNING_MIN_MINUTES"),
DEFAULT_MIN_MINUTES DEFAULT_MIN_MINUTES
); );
@@ -223,7 +237,7 @@ async function main(args: string[]): Promise<number> {
console.log(JSON.stringify({})); console.log(JSON.stringify({}));
return 0; return 0;
} catch (error) { } catch (error) {
console.error("[continuous-learning-stop] failed", error); console.error("[continual-learning-stop] failed", error);
console.log(JSON.stringify({})); console.log(JSON.stringify({}));
return 0; return 0;
} }
@@ -3,7 +3,7 @@
"hooks": { "hooks": {
"stop": [ "stop": [
{ {
"command": "bun run ./hooks/continuous-learning-stop.ts --trial" "command": "bun run ./hooks/continual-learning-stop.ts --trial"
} }
] ]
} }
@@ -1,9 +1,9 @@
--- ---
name: continuous-learning name: continual-learning
description: Incrementally extract recurring user corrections and durable workspace facts from transcript changes, then update AGENTS.md with plain bullet points only. Use when the user asks to mine previous chats, maintain AGENTS.md memory, or build a self-learning preference loop. description: Incrementally extract recurring user corrections and durable workspace facts from transcript changes, then update AGENTS.md with plain bullet points only. Use when the user asks to mine previous chats, maintain AGENTS.md memory, or build a self-learning preference loop.
--- ---
# Continuous Learning # Continual Learning
Keep `AGENTS.md` current using transcript deltas instead of full rescans. Keep `AGENTS.md` current using transcript deltas instead of full rescans.
@@ -11,7 +11,7 @@ Keep `AGENTS.md` current using transcript deltas instead of full rescans.
- Transcript root: `~/.cursor/projects/<workspace-slug>/agent-transcripts/` - Transcript root: `~/.cursor/projects/<workspace-slug>/agent-transcripts/`
- Existing memory file: `AGENTS.md` - Existing memory file: `AGENTS.md`
- Incremental index: `.cursor/hooks/state/continuous-learning-index.json` - Incremental index: `.cursor/hooks/state/continual-learning-index.json`
## Workflow ## Workflow