@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.
- package/CHANGELOG.md +40 -0
- package/LICENSE +21 -0
- package/README.md +250 -0
- package/config/defaults.json +25 -0
- package/config/schema.json +134 -0
- package/extensions/folder-detector.d.ts +34 -0
- package/extensions/folder-detector.d.ts.map +1 -0
- package/extensions/folder-detector.js +197 -0
- package/extensions/folder-detector.js.map +1 -0
- package/extensions/index.d.ts +12 -0
- package/extensions/index.d.ts.map +1 -0
- package/extensions/index.js +227 -0
- package/extensions/index.js.map +1 -0
- package/extensions/integrity-guard.d.ts +25 -0
- package/extensions/integrity-guard.d.ts.map +1 -0
- package/extensions/integrity-guard.js +118 -0
- package/extensions/integrity-guard.js.map +1 -0
- package/extensions/progress-tracker.d.ts +33 -0
- package/extensions/progress-tracker.d.ts.map +1 -0
- package/extensions/progress-tracker.js +175 -0
- package/extensions/progress-tracker.js.map +1 -0
- package/extensions/semester-detector.d.ts +53 -0
- package/extensions/semester-detector.d.ts.map +1 -0
- package/extensions/semester-detector.js +197 -0
- package/extensions/semester-detector.js.map +1 -0
- package/index.d.ts +146 -0
- package/index.js +381 -0
- package/index.js.map +1 -0
- package/package.json +33 -0
- package/pi-cs.meta.json +7 -0
- package/pi-package.yaml +76 -0
- package/skills/exam/SKILL.md +186 -0
- package/skills/explain/SKILL.md +124 -0
- package/skills/homework/SKILL.md +89 -0
- package/skills/leetcode/SKILL.md +139 -0
- package/skills/project/SKILL.md +143 -0
- package/skills/research/SKILL.md +164 -0
- package/skills/review/SKILL.md +136 -0
- package/system.md +98 -0
- package/templates/project-init.md +141 -0
- package/templates/research-paper.md +134 -0
- 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
|
+
}
|
package/pi-cs.meta.json
ADDED
package/pi-package.yaml
ADDED
|
@@ -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
|