@teammates/cli 0.6.1 → 0.6.2
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/dist/cli.js +7 -6
- package/dist/onboard.js +18 -12
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -304,11 +304,12 @@ class TeammatesREPL {
|
|
|
304
304
|
this.statusFrame = 0;
|
|
305
305
|
this.statusRotateIndex = 0;
|
|
306
306
|
this.renderStatusFrame();
|
|
307
|
-
// Animate spinner at ~
|
|
307
|
+
// Animate spinner at ~200ms (fast enough for visual smoothness,
|
|
308
|
+
// slow enough to avoid saturating the render loop under load)
|
|
308
309
|
this.statusTimer = setInterval(() => {
|
|
309
310
|
this.statusFrame++;
|
|
310
311
|
this.renderStatusFrame();
|
|
311
|
-
},
|
|
312
|
+
}, 200);
|
|
312
313
|
// Rotate through teammates every 3 seconds
|
|
313
314
|
this.statusRotateTimer = setInterval(() => {
|
|
314
315
|
if (this.activeTasks.size > 1) {
|
|
@@ -395,7 +396,7 @@ class TeammatesREPL {
|
|
|
395
396
|
: cleanTask;
|
|
396
397
|
if (this.chatView) {
|
|
397
398
|
this.chatView.setProgress(concat(tp.accent(`${spinChar} ${displayName}... `), tp.muted(`${taskText}${suffix}`)));
|
|
398
|
-
this.app.
|
|
399
|
+
this.app.scheduleRefresh();
|
|
399
400
|
}
|
|
400
401
|
else {
|
|
401
402
|
const spinColor = this.statusFrame % 8 === 0 ? chalk.blue : chalk.blueBright;
|
|
@@ -1737,8 +1738,8 @@ Do NOT modify any other teammate's files. Only edit your own SOUL.md and daily l
|
|
|
1737
1738
|
const userMdPath = join(teammatesDir, "USER.md");
|
|
1738
1739
|
try {
|
|
1739
1740
|
const content = readFileSync(userMdPath, "utf-8");
|
|
1740
|
-
// Template placeholders contain "<
|
|
1741
|
-
return !content.trim() || content.includes("<your name>");
|
|
1741
|
+
// Template placeholders contain "<Your name>" — treat as not set up
|
|
1742
|
+
return !content.trim() || content.toLowerCase().includes("<your name>");
|
|
1742
1743
|
}
|
|
1743
1744
|
catch {
|
|
1744
1745
|
// File doesn't exist
|
|
@@ -3339,7 +3340,7 @@ Do NOT modify any other teammate's files. Only edit your own SOUL.md and daily l
|
|
|
3339
3340
|
{
|
|
3340
3341
|
name: "script",
|
|
3341
3342
|
aliases: [],
|
|
3342
|
-
usage: "/script [
|
|
3343
|
+
usage: "/script [description]",
|
|
3343
3344
|
description: "Write and run reusable scripts via the coding agent",
|
|
3344
3345
|
run: (args) => this.cmdScript(args),
|
|
3345
3346
|
},
|
package/dist/onboard.js
CHANGED
|
@@ -108,6 +108,19 @@ async function isTeammateFolder(dirPath) {
|
|
|
108
108
|
return false;
|
|
109
109
|
}
|
|
110
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* Detect whether a teammate folder is a human avatar (**Type:** human in SOUL.md).
|
|
113
|
+
* Human avatars are user-specific and should not be imported to other projects.
|
|
114
|
+
*/
|
|
115
|
+
async function isHumanAvatar(dirPath) {
|
|
116
|
+
try {
|
|
117
|
+
const soul = await readFile(join(dirPath, "SOUL.md"), "utf-8");
|
|
118
|
+
return /\*\*Type:\*\*\s*human/i.test(soul);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
111
124
|
/**
|
|
112
125
|
* Import teammates from another project's .teammates/ dir.
|
|
113
126
|
*
|
|
@@ -138,6 +151,9 @@ export async function importTeammates(sourceDir, targetDir) {
|
|
|
138
151
|
if (entry.isDirectory() && !isNonTeammateEntry(entry.name)) {
|
|
139
152
|
// Check if it's a teammate folder
|
|
140
153
|
if (await isTeammateFolder(srcPath)) {
|
|
154
|
+
// Skip human avatar folders — those are user-specific, not team members
|
|
155
|
+
if (await isHumanAvatar(srcPath))
|
|
156
|
+
continue;
|
|
141
157
|
// Skip if teammate already exists in target
|
|
142
158
|
try {
|
|
143
159
|
await stat(destPath);
|
|
@@ -165,18 +181,8 @@ export async function importTeammates(sourceDir, targetDir) {
|
|
|
165
181
|
teammates.push(entry.name);
|
|
166
182
|
}
|
|
167
183
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
// PROTOCOL.md, TEMPLATE.md) are project-specific and get created fresh
|
|
171
|
-
// from the template by copyTemplateFiles().
|
|
172
|
-
try {
|
|
173
|
-
await stat(destPath);
|
|
174
|
-
}
|
|
175
|
-
catch {
|
|
176
|
-
await copyFile(srcPath, destPath);
|
|
177
|
-
files.push(entry.name);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
184
|
+
// USER.md is user-specific (gitignored) — never import it.
|
|
185
|
+
// The new user creates their own profile during setup.
|
|
180
186
|
}
|
|
181
187
|
// Ensure .gitignore exists
|
|
182
188
|
const gitignoreDest = join(targetDir, ".gitignore");
|
package/package.json
CHANGED