@aethrekh/pi-cs 0.1.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.
Files changed (42) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/LICENSE +21 -0
  3. package/README.md +250 -0
  4. package/config/defaults.json +25 -0
  5. package/config/schema.json +134 -0
  6. package/extensions/folder-detector.d.ts +34 -0
  7. package/extensions/folder-detector.d.ts.map +1 -0
  8. package/extensions/folder-detector.js +197 -0
  9. package/extensions/folder-detector.js.map +1 -0
  10. package/extensions/index.d.ts +12 -0
  11. package/extensions/index.d.ts.map +1 -0
  12. package/extensions/index.js +227 -0
  13. package/extensions/index.js.map +1 -0
  14. package/extensions/integrity-guard.d.ts +25 -0
  15. package/extensions/integrity-guard.d.ts.map +1 -0
  16. package/extensions/integrity-guard.js +118 -0
  17. package/extensions/integrity-guard.js.map +1 -0
  18. package/extensions/progress-tracker.d.ts +33 -0
  19. package/extensions/progress-tracker.d.ts.map +1 -0
  20. package/extensions/progress-tracker.js +175 -0
  21. package/extensions/progress-tracker.js.map +1 -0
  22. package/extensions/semester-detector.d.ts +53 -0
  23. package/extensions/semester-detector.d.ts.map +1 -0
  24. package/extensions/semester-detector.js +197 -0
  25. package/extensions/semester-detector.js.map +1 -0
  26. package/index.d.ts +146 -0
  27. package/index.js +381 -0
  28. package/index.js.map +1 -0
  29. package/package.json +33 -0
  30. package/pi-cs.meta.json +7 -0
  31. package/pi-package.yaml +76 -0
  32. package/skills/exam/SKILL.md +186 -0
  33. package/skills/explain/SKILL.md +124 -0
  34. package/skills/homework/SKILL.md +89 -0
  35. package/skills/leetcode/SKILL.md +139 -0
  36. package/skills/project/SKILL.md +143 -0
  37. package/skills/research/SKILL.md +164 -0
  38. package/skills/review/SKILL.md +136 -0
  39. package/system.md +98 -0
  40. package/templates/project-init.md +141 -0
  41. package/templates/research-paper.md +134 -0
  42. package/templates/semester-init.md +49 -0
package/index.js ADDED
@@ -0,0 +1,381 @@
1
+ "use strict";
2
+ /**
3
+ * src/index.ts
4
+ *
5
+ * pi-cs (Pisces) — Package Entry Point
6
+ *
7
+ * This is the single file Pi loads when the package is activated.
8
+ * It wires together all extensions, registers lifecycle hooks, loads
9
+ * user config, and exposes the public API surface the Pi runtime calls.
10
+ *
11
+ * Lifecycle order:
12
+ * 1. onLoad() — package installed / Pi starts, config resolved
13
+ * 2. onStartup() — new session begins, context injected
14
+ * 3. onDirectoryChange() — cwd changed mid-session
15
+ * 4. onSkillCall() — user invokes a /skill command
16
+ * 5. onSessionEnd() — session closes, progress recorded
17
+ */
18
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ var desc = Object.getOwnPropertyDescriptor(m, k);
21
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
22
+ desc = { enumerable: true, get: function() { return m[k]; } };
23
+ }
24
+ Object.defineProperty(o, k2, desc);
25
+ }) : (function(o, m, k, k2) {
26
+ if (k2 === undefined) k2 = k;
27
+ o[k2] = m[k];
28
+ }));
29
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
30
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
31
+ }) : function(o, v) {
32
+ o["default"] = v;
33
+ });
34
+ var __importStar = (this && this.__importStar) || (function () {
35
+ var ownKeys = function(o) {
36
+ ownKeys = Object.getOwnPropertyNames || function (o) {
37
+ var ar = [];
38
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
39
+ return ar;
40
+ };
41
+ return ownKeys(o);
42
+ };
43
+ return function (mod) {
44
+ if (mod && mod.__esModule) return mod;
45
+ var result = {};
46
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
47
+ __setModuleDefault(result, mod);
48
+ return result;
49
+ };
50
+ })();
51
+ Object.defineProperty(exports, "__esModule", { value: true });
52
+ exports.SKILLS = exports.PACKAGE_VERSION = exports.PACKAGE_NAME = void 0;
53
+ exports.loadConfig = loadConfig;
54
+ exports.createSessionState = createSessionState;
55
+ exports.onLoad = onLoad;
56
+ exports.onStartup = onStartup;
57
+ exports.onDirectoryChange = onDirectoryChange;
58
+ exports.onSkillCall = onSkillCall;
59
+ exports.onSessionEnd = onSessionEnd;
60
+ exports.onMidSession = onMidSession;
61
+ exports.getActiveSemesterContext = getActiveSemesterContext;
62
+ exports.getActiveProjectContext = getActiveProjectContext;
63
+ exports.isValidSkill = isValidSkill;
64
+ exports.describe = describe;
65
+ const path = __importStar(require("path"));
66
+ const fs = __importStar(require("fs"));
67
+ const os = __importStar(require("os"));
68
+ // ─── Extension Imports ─────────────────────────────────────────────────────
69
+ const semester_detector_1 = require("./extensions/semester-detector");
70
+ const folder_detector_1 = require("./extensions/folder-detector");
71
+ const integrity_guard_1 = require("./extensions/integrity-guard");
72
+ const progress_tracker_1 = require("./extensions/progress-tracker");
73
+ // ─── Package Metadata ──────────────────────────────────────────────────────
74
+ exports.PACKAGE_NAME = "pi-cs";
75
+ exports.PACKAGE_VERSION = "0.1.0";
76
+ exports.SKILLS = [
77
+ "homework",
78
+ "project",
79
+ "review",
80
+ "explain",
81
+ "leetcode",
82
+ "exam",
83
+ "research",
84
+ ];
85
+ // ─── Config Loader ─────────────────────────────────────────────────────────
86
+ const DEFAULTS_PATH = path.join(__dirname, "../config/defaults.json");
87
+ function getConfigSearchPaths() {
88
+ return [
89
+ path.join(process.cwd(), ".pi-cs.json"),
90
+ path.join(os.homedir(), ".pi", "pi-cs.json"),
91
+ path.join(os.homedir(), ".config", "pi-cs", "config.json"),
92
+ ];
93
+ }
94
+ /**
95
+ * Loads and merges user config over package defaults.
96
+ * Never throws — falls back to defaults on any read/parse error.
97
+ */
98
+ function loadConfig() {
99
+ let defaults = {};
100
+ try {
101
+ const raw = fs.readFileSync(DEFAULTS_PATH, "utf-8");
102
+ defaults = JSON.parse(raw);
103
+ }
104
+ catch {
105
+ // Defaults file unreadable — use hardcoded fallback
106
+ defaults = {
107
+ explanations: { default_depth: "intermediate", prefer_visuals: true, use_analogies: true },
108
+ code: { style: "balanced", always_include_complexity: true, always_include_tests: false },
109
+ integrity: { enabled: true, strictness: "balanced" },
110
+ productivity: { burnout_nudges: true, session_warning_minutes: 180, weekly_summary: true },
111
+ };
112
+ }
113
+ // Search for user config file — use first one found
114
+ for (const configPath of getConfigSearchPaths()) {
115
+ try {
116
+ if (fs.existsSync(configPath)) {
117
+ const raw = fs.readFileSync(configPath, "utf-8");
118
+ const userConfig = JSON.parse(raw);
119
+ return deepMerge(defaults, userConfig);
120
+ }
121
+ }
122
+ catch {
123
+ continue;
124
+ }
125
+ }
126
+ return defaults;
127
+ }
128
+ /**
129
+ * Deep merges two config objects. User values override defaults at every level.
130
+ */
131
+ function deepMerge(base, override) {
132
+ const result = { ...base };
133
+ for (const key of Object.keys(override)) {
134
+ const baseVal = base[key];
135
+ const overrideVal = override[key];
136
+ if (overrideVal !== null &&
137
+ typeof overrideVal === "object" &&
138
+ !Array.isArray(overrideVal) &&
139
+ typeof baseVal === "object" &&
140
+ baseVal !== null) {
141
+ result[key] = deepMerge(baseVal, overrideVal);
142
+ }
143
+ else if (overrideVal !== undefined) {
144
+ result[key] = overrideVal;
145
+ }
146
+ }
147
+ return result;
148
+ }
149
+ // ─── Session State ─────────────────────────────────────────────────────────
150
+ /**
151
+ * Creates a fresh session state object. Called by Pi at session start.
152
+ */
153
+ function createSessionState() {
154
+ return {
155
+ startTime: new Date(),
156
+ skillsUsed: [],
157
+ topicsWorked: [],
158
+ semesterContext: null,
159
+ folderContext: null,
160
+ warningIssuedAt: null,
161
+ };
162
+ }
163
+ // ─── Lifecycle Hooks ────────────────────────────────────────────────────────
164
+ /**
165
+ * onLoad — called once when Pi installs or loads the package.
166
+ * Validates the environment and logs the package is ready.
167
+ */
168
+ function onLoad() {
169
+ const nodeVersion = process.version;
170
+ const major = parseInt(nodeVersion.slice(1).split(".")[0], 10);
171
+ if (major < 18) {
172
+ return {
173
+ ok: false,
174
+ message: `pi-cs requires Node.js >= 18. Current: ${nodeVersion}. Please upgrade.`,
175
+ };
176
+ }
177
+ const config = loadConfig();
178
+ const configSource = getConfigSearchPaths().find((p) => {
179
+ try {
180
+ return fs.existsSync(p);
181
+ }
182
+ catch {
183
+ return false;
184
+ }
185
+ }) ?? "defaults";
186
+ return {
187
+ ok: true,
188
+ message: `pi-cs ${exports.PACKAGE_VERSION} loaded. Config: ${configSource}. Integrity guard: ${config.integrity?.enabled !== false ? "on" : "off"}.`,
189
+ };
190
+ }
191
+ /**
192
+ * onStartup — called at the start of every Pi session.
193
+ * Runs semester + folder detectors, builds greeting and context injection.
194
+ */
195
+ function onStartup(state) {
196
+ const config = loadConfig();
197
+ // Run semester detector
198
+ const semesterResult = (0, semester_detector_1.run)();
199
+ if (semesterResult) {
200
+ // Extract context if found (greeting contains it serialised in comment blocks)
201
+ const detection = (0, semester_detector_1.detectSemesterContext)();
202
+ state.semesterContext = detection.context ?? null;
203
+ }
204
+ // Run folder detector
205
+ const folderResult = (0, folder_detector_1.run)();
206
+ state.folderContext = (0, folder_detector_1.detectFolderContext)();
207
+ // Build the combined context injection block
208
+ const contextParts = [];
209
+ if (semesterResult.inject) {
210
+ contextParts.push(semesterResult.inject);
211
+ }
212
+ if (folderResult.inject) {
213
+ contextParts.push(folderResult.inject);
214
+ }
215
+ // Inject config-derived hints
216
+ contextParts.push(buildConfigInjection(config));
217
+ return {
218
+ contextInjection: contextParts.filter(Boolean).join("\n\n"),
219
+ greeting: semesterResult.greeting,
220
+ config,
221
+ };
222
+ }
223
+ /**
224
+ * onDirectoryChange — called when the user `cd`s to a new directory.
225
+ * Re-runs context detectors so Pi stays accurate.
226
+ */
227
+ function onDirectoryChange(state) {
228
+ const semesterResult = (0, semester_detector_1.run)();
229
+ const folderResult = (0, folder_detector_1.run)();
230
+ const newFolderContext = (0, folder_detector_1.detectFolderContext)();
231
+ const previousProject = state.folderContext?.project?.name;
232
+ const newProject = newFolderContext?.project?.name;
233
+ // Update session state
234
+ state.folderContext = newFolderContext;
235
+ if ((0, semester_detector_1.detectSemesterContext)().context) {
236
+ state.semesterContext = (0, semester_detector_1.detectSemesterContext)().context ?? null;
237
+ }
238
+ const contextParts = [semesterResult.inject, folderResult.inject].filter(Boolean);
239
+ // Notify if we've moved into a different project
240
+ const message = newProject && newProject !== previousProject
241
+ ? `📂 Switched to project: **${newProject}** (${newFolderContext.project?.type ?? "unknown"})`
242
+ : null;
243
+ return {
244
+ contextInjection: contextParts.join("\n\n"),
245
+ message,
246
+ };
247
+ }
248
+ /**
249
+ * onSkillCall — called just before Pi executes a skill.
250
+ * Runs the integrity guard and records the skill in session state.
251
+ */
252
+ function onSkillCall(context) {
253
+ const { skillName, userInput, sessionState } = context;
254
+ const config = loadConfig();
255
+ // Record skill usage
256
+ if (!sessionState.skillsUsed.includes(skillName)) {
257
+ sessionState.skillsUsed.push(skillName);
258
+ }
259
+ // Skip integrity check if disabled in config
260
+ if (config.integrity?.enabled === false) {
261
+ return { proceed: true, injection: "" };
262
+ }
263
+ const guardResult = (0, integrity_guard_1.run)({ skillName, userInput });
264
+ return {
265
+ proceed: true, // never hard-block — always redirect gracefully
266
+ injection: guardResult.inject,
267
+ };
268
+ }
269
+ /**
270
+ * onSessionEnd — called when the Pi session closes.
271
+ * Records session stats, surfaces a burnout nudge and weekly summary if configured.
272
+ */
273
+ function onSessionEnd(state) {
274
+ const config = loadConfig();
275
+ const durationMinutes = Math.round((Date.now() - state.startTime.getTime()) / 60000);
276
+ const trackerResult = (0, progress_tracker_1.run)({
277
+ sessionDurationMinutes: durationMinutes,
278
+ skillsUsed: state.skillsUsed,
279
+ topicsWorked: state.topicsWorked,
280
+ });
281
+ return {
282
+ nudge: config.productivity?.burnout_nudges !== false ? trackerResult.nudge : null,
283
+ summary: config.productivity?.weekly_summary !== false ? trackerResult.weeklySummary : null,
284
+ };
285
+ }
286
+ /**
287
+ * onMidSession — called periodically by Pi (e.g. every 30 min).
288
+ * Issues a burnout warning if the session has exceeded the configured threshold.
289
+ */
290
+ function onMidSession(state) {
291
+ const config = loadConfig();
292
+ const warnAt = config.productivity?.session_warning_minutes ?? 180;
293
+ if (!config.productivity?.burnout_nudges)
294
+ return { warning: null };
295
+ const elapsedMinutes = Math.round((Date.now() - state.startTime.getTime()) / 60000);
296
+ // Only issue the warning once per session
297
+ if (elapsedMinutes >= warnAt && state.warningIssuedAt === null) {
298
+ state.warningIssuedAt = elapsedMinutes;
299
+ return {
300
+ warning: `🐠 You've been at this for ${elapsedMinutes} minutes. Time for a short break — your brain will thank you.`,
301
+ };
302
+ }
303
+ return { warning: null };
304
+ }
305
+ // ─── Context Injection Helpers ─────────────────────────────────────────────
306
+ /**
307
+ * Builds a config-derived injection block that nudges Pi's behavior
308
+ * based on the user's preferences without overriding the system prompt.
309
+ */
310
+ function buildConfigInjection(config) {
311
+ const hints = [];
312
+ if (config.student?.name) {
313
+ hints.push(`Student name: ${config.student.name}`);
314
+ }
315
+ if (config.student?.year_of_study) {
316
+ const yearLabels = {
317
+ 1: "Freshman (1st year)",
318
+ 2: "Sophomore (2nd year)",
319
+ 3: "Junior (3rd year)",
320
+ 4: "Senior (4th year)",
321
+ 5: "Graduate (1st year)",
322
+ 6: "Graduate (2nd year+)",
323
+ };
324
+ hints.push(`Year of study: ${yearLabels[config.student.year_of_study] ?? config.student.year_of_study}`);
325
+ }
326
+ if (config.student?.primary_language) {
327
+ hints.push(`Primary language: ${config.student.primary_language}`);
328
+ }
329
+ if (config.explanations?.default_depth) {
330
+ hints.push(`Explanation depth preference: ${config.explanations.default_depth}`);
331
+ }
332
+ if (config.code?.always_include_complexity) {
333
+ hints.push("Always annotate algorithm time/space complexity");
334
+ }
335
+ if (config.code?.always_include_tests) {
336
+ hints.push("Always suggest test cases alongside code");
337
+ }
338
+ if (!hints.length)
339
+ return "";
340
+ return [
341
+ "<!-- USER CONFIG PREFERENCES -->",
342
+ ...hints.map((h) => `<!-- ${h} -->`),
343
+ ].join("\n");
344
+ }
345
+ // ─── Public Utility API ────────────────────────────────────────────────────
346
+ /**
347
+ * Returns the active semester context for the current session.
348
+ * Useful for extensions or templates that need course/week info.
349
+ */
350
+ function getActiveSemesterContext(state) {
351
+ return state.semesterContext;
352
+ }
353
+ /**
354
+ * Returns the active project context for the current session.
355
+ */
356
+ function getActiveProjectContext(state) {
357
+ return state.folderContext?.project ?? null;
358
+ }
359
+ /**
360
+ * Checks if a given skill name is valid (registered in this package).
361
+ */
362
+ function isValidSkill(name) {
363
+ return exports.SKILLS.includes(name);
364
+ }
365
+ /**
366
+ * Returns a short summary of what pi-cs provides, for display in Pi's
367
+ * package listing or help output.
368
+ */
369
+ function describe() {
370
+ return [
371
+ `🐠 pi-cs (Pisces) v${exports.PACKAGE_VERSION}`,
372
+ ` The CS Student Edition for Pi Coding Agent`,
373
+ ``,
374
+ ` Skills: /${exports.SKILLS.join(", /")}`,
375
+ ` Extensions: semester-detector, folder-detector, integrity-guard, progress-tracker`,
376
+ ` Config: ~/.pi/pi-cs.json`,
377
+ ``,
378
+ ` Run any skill with /<name>, e.g. /homework or /explain binary search`,
379
+ ].join("\n");
380
+ }
381
+ //# sourceMappingURL=index.js.map
package/index.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@aethrekh/pi-cs",
3
+ "version": "0.1.0",
4
+ "description": "Pisces — The CS Student Edition for Pi Coding Agent. Your personal AI teaching assistant from homework to thesis.",
5
+ "keywords": [
6
+ "academic",
7
+ "computer-science",
8
+ "teaching-assistant",
9
+ "coding-agent",
10
+ "cs-student",
11
+ "homework",
12
+ "pi",
13
+ "pi-package"
14
+ ],
15
+ "author": "Ashish Bagdane <ashishbagdane1@gmail.com>",
16
+ "license": "MIT",
17
+ "main": "index.js",
18
+ "types": "index.d.ts",
19
+ "engines": {
20
+ "node": ">=18.0.0"
21
+ },
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "https://github.com/AshishBagdane/pi-cs.git"
25
+ },
26
+ "bugs": {
27
+ "url": "https://github.com/AshishBagdane/pi-cs/issues"
28
+ },
29
+ "homepage": "https://github.com/AshishBagdane/pi-cs#readme",
30
+ "peerDependencies": {
31
+ "@earendil-works/pi-coding-agent": "*"
32
+ }
33
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "pi-cs",
3
+ "version": "0.1.0",
4
+ "built_at": "2026-06-02T04:46:16.850Z",
5
+ "entry": "index.js",
6
+ "node_minimum": "18.0.0"
7
+ }
@@ -0,0 +1,76 @@
1
+ name: pi-cs
2
+ version: 0.1.0
3
+ display_name: "pi-cs (Pisces)"
4
+ description: "The CS Student Edition for Pi — Your personal AI teaching assistant for Computer Science, from homework to thesis."
5
+ author: ""
6
+ license: MIT
7
+ pi_version: ">=1.0.0"
8
+
9
+ # Core system prompt that defines the academic persona
10
+ system: system.md
11
+
12
+ # Skills (slash commands) registered by this package
13
+ skills:
14
+ - name: homework
15
+ path: skills/homework/SKILL.md
16
+ description: "Break down problems, provide guided hints, and walk through step-by-step implementation"
17
+ - name: project
18
+ path: skills/project/SKILL.md
19
+ description: "Full project kickoff: requirements → architecture → tech stack → scaffolding"
20
+ - name: review
21
+ path: skills/review/SKILL.md
22
+ description: "Strict TA-level code review covering style, efficiency, edge cases, and security"
23
+ - name: explain
24
+ path: skills/explain/SKILL.md
25
+ description: "Concept explanations with analogies, Mermaid diagrams, and connections to prior knowledge"
26
+ - name: leetcode
27
+ path: skills/leetcode/SKILL.md
28
+ description: "Problem parsing, optimized solutions with time/space complexity analysis"
29
+ - name: exam
30
+ path: skills/exam/SKILL.md
31
+ description: "Practice questions, mind maps, and revision plans for upcoming exams"
32
+ - name: research
33
+ path: skills/research/SKILL.md
34
+ description: "Paper summarization, arXiv search, and literature review assistance"
35
+
36
+ # Extensions that run automatically in the background
37
+ extensions:
38
+ - name: semester-detector
39
+ path: extensions/semester-detector.js
40
+ description: "Auto-detects semester context from SEMESTER.md and folder structures"
41
+ triggers:
42
+ - on_startup
43
+ - on_directory_change
44
+ - name: folder-detector
45
+ path: extensions/folder-detector.js
46
+ description: "Detects standard CS university folder structures and sets project context"
47
+ triggers:
48
+ - on_startup
49
+ - on_directory_change
50
+ - name: integrity-guard
51
+ path: extensions/integrity-guard.js
52
+ description: "Monitors for academic integrity violations and adds appropriate warnings"
53
+ triggers:
54
+ - on_skill_call
55
+ - name: progress-tracker
56
+ path: extensions/progress-tracker.js
57
+ description: "Tracks weekly activity and surfaces burnout prevention nudges"
58
+ triggers:
59
+ - on_session_end
60
+
61
+ # Templates available for scaffolding
62
+ templates:
63
+ - name: semester-init
64
+ path: templates/semester-init.md
65
+ description: "Initialize a new semester workspace with SEMESTER.md and folder structure"
66
+ - name: project-init
67
+ path: templates/project-init.md
68
+ description: "Bootstrap a new CS project with README, structure, and CI"
69
+ - name: research-paper
70
+ path: templates/research-paper.md
71
+ description: "Academic research paper structure and writing guide"
72
+
73
+ # User-level config schema
74
+ config:
75
+ schema: config/schema.json
76
+ defaults: config/defaults.json