x-ipe 1.0.21__py3-none-any.whl → 1.0.23__py3-none-any.whl
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.
- x_ipe/cli/main.py +60 -64
- x_ipe/core/scaffold.py +7 -13
- x_ipe/static/js/features/workplace.js +11 -0
- {x_ipe-1.0.21.dist-info → x_ipe-1.0.23.dist-info}/METADATA +1 -1
- {x_ipe-1.0.21.dist-info → x_ipe-1.0.23.dist-info}/RECORD +8 -8
- {x_ipe-1.0.21.dist-info → x_ipe-1.0.23.dist-info}/WHEEL +0 -0
- {x_ipe-1.0.21.dist-info → x_ipe-1.0.23.dist-info}/entry_points.txt +0 -0
- {x_ipe-1.0.21.dist-info → x_ipe-1.0.23.dist-info}/licenses/LICENSE +0 -0
x_ipe/cli/main.py
CHANGED
|
@@ -204,7 +204,6 @@ def init(ctx: click.Context, force: bool, dry_run: bool, no_skills: bool, no_mcp
|
|
|
204
204
|
|
|
205
205
|
# Create folder structure
|
|
206
206
|
scaffold.create_docs_structure()
|
|
207
|
-
scaffold.create_runtime_folder()
|
|
208
207
|
|
|
209
208
|
# Copy skills if requested
|
|
210
209
|
if not no_skills:
|
|
@@ -228,10 +227,6 @@ def init(ctx: click.Context, force: bool, dry_run: bool, no_skills: bool, no_mcp
|
|
|
228
227
|
# Create config file
|
|
229
228
|
scaffold.create_config_file()
|
|
230
229
|
|
|
231
|
-
# Update .gitignore if in git repo
|
|
232
|
-
if (project_root / ".git").exists():
|
|
233
|
-
scaffold.update_gitignore()
|
|
234
|
-
|
|
235
230
|
# MCP config merge with user confirmation
|
|
236
231
|
mcp_servers = scaffold.get_project_mcp_servers()
|
|
237
232
|
if mcp_servers and not dry_run and not no_mcp:
|
|
@@ -425,71 +420,72 @@ def upgrade(ctx: click.Context, force: bool, dry_run: bool,
|
|
|
425
420
|
|
|
426
421
|
# Check for package skills
|
|
427
422
|
package_skills = skills_manager.get_package_skills()
|
|
423
|
+
has_skills = bool(package_skills)
|
|
424
|
+
|
|
428
425
|
if not package_skills:
|
|
429
426
|
click.echo("No package skills available to sync.")
|
|
430
427
|
click.echo("X-IPE may not be installed as a package, or skills are not bundled.")
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
click.echo(f"Package skills available: {len(package_skills)}")
|
|
434
|
-
|
|
435
|
-
# Check local skills
|
|
436
|
-
local_skills = skills_manager.get_local_skills()
|
|
437
|
-
modified = skills_manager.detect_modifications()
|
|
428
|
+
else:
|
|
429
|
+
click.echo(f"Package skills available: {len(package_skills)}")
|
|
438
430
|
|
|
439
|
-
if
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
431
|
+
# Only process skills if package skills are available
|
|
432
|
+
if has_skills:
|
|
433
|
+
# Check local skills
|
|
434
|
+
local_skills = skills_manager.get_local_skills()
|
|
435
|
+
modified = skills_manager.detect_modifications()
|
|
436
|
+
|
|
437
|
+
if local_skills:
|
|
438
|
+
click.echo(f"Local skills: {len(local_skills)}")
|
|
439
|
+
if modified:
|
|
440
|
+
click.echo(f"Modified skills: {len(modified)}")
|
|
441
|
+
|
|
442
|
+
# Filter by specific skill if requested
|
|
443
|
+
if skill:
|
|
444
|
+
package_skills = [s for s in package_skills if s.name == skill]
|
|
445
|
+
if not package_skills:
|
|
446
|
+
click.echo(f"\nError: Skill '{skill}' not found in package.")
|
|
447
|
+
raise click.Abort()
|
|
448
|
+
click.echo(f"\nUpgrading skill: {skill}")
|
|
449
|
+
|
|
450
|
+
# Check for modifications that would be overwritten
|
|
451
|
+
skills_to_warn = []
|
|
452
|
+
if not force:
|
|
453
|
+
for pkg_skill in package_skills:
|
|
454
|
+
local_skill = skills_manager.get_skill_info(pkg_skill.name)
|
|
455
|
+
if local_skill and local_skill.source == "local" and local_skill.modified:
|
|
456
|
+
skills_to_warn.append(local_skill)
|
|
457
|
+
|
|
458
|
+
if skills_to_warn:
|
|
459
|
+
click.echo(f"\nThe following skills have local modifications:")
|
|
460
|
+
for s in skills_to_warn:
|
|
461
|
+
click.echo(f" ⚠ {s.name}")
|
|
462
|
+
|
|
463
|
+
if not dry_run:
|
|
464
|
+
if not force:
|
|
465
|
+
if not click.confirm("\nOverwrite modified skills?"):
|
|
466
|
+
click.echo("Aborted.")
|
|
467
|
+
# Continue to MCP config section
|
|
464
468
|
|
|
465
469
|
if not dry_run:
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
click.echo(f"\n✓ Synced {len(synced)} skill(s):")
|
|
486
|
-
for name in synced:
|
|
487
|
-
click.echo(f" ✓ {name}")
|
|
488
|
-
else:
|
|
489
|
-
click.echo("\nNo skills were synced.")
|
|
490
|
-
|
|
491
|
-
if backup and skills_to_warn:
|
|
492
|
-
click.echo(f"\nBackups created in: {project_root / '.x-ipe' / 'backups'}")
|
|
470
|
+
# Perform the sync
|
|
471
|
+
synced = skills_manager.sync_from_package(
|
|
472
|
+
skill_name=skill,
|
|
473
|
+
backup=backup
|
|
474
|
+
)
|
|
475
|
+
|
|
476
|
+
if synced:
|
|
477
|
+
click.echo(f"\n✓ Synced {len(synced)} skill(s):")
|
|
478
|
+
for name in synced:
|
|
479
|
+
click.echo(f" ✓ {name}")
|
|
480
|
+
else:
|
|
481
|
+
click.echo("\nNo skills were synced.")
|
|
482
|
+
|
|
483
|
+
if backup and skills_to_warn:
|
|
484
|
+
click.echo(f"\nBackups created in: {project_root / '.x-ipe' / 'backups'}")
|
|
485
|
+
else:
|
|
486
|
+
click.echo("\nDry run - would sync:")
|
|
487
|
+
for pkg_skill in package_skills:
|
|
488
|
+
click.echo(f" → {pkg_skill.name}")
|
|
493
489
|
|
|
494
490
|
# Copy/update MCP config from package, then merge to global
|
|
495
491
|
scaffold = ScaffoldManager(project_root, dry_run=dry_run, force=force)
|
x_ipe/core/scaffold.py
CHANGED
|
@@ -12,17 +12,12 @@ class ScaffoldManager:
|
|
|
12
12
|
DOCS_STRUCTURE = [
|
|
13
13
|
"x-ipe-docs/requirements",
|
|
14
14
|
"x-ipe-docs/planning",
|
|
15
|
-
"x-ipe-docs/features",
|
|
16
15
|
"x-ipe-docs/ideas",
|
|
17
16
|
"x-ipe-docs/config",
|
|
18
17
|
"x-ipe-docs/themes",
|
|
19
18
|
]
|
|
20
19
|
|
|
21
|
-
GITIGNORE_ENTRIES = [
|
|
22
|
-
"# X-IPE Runtime (managed by x-ipe)",
|
|
23
|
-
".x-ipe/",
|
|
24
|
-
"",
|
|
25
|
-
]
|
|
20
|
+
GITIGNORE_ENTRIES: list = [] # No X-IPE specific gitignore entries needed
|
|
26
21
|
|
|
27
22
|
def __init__(self, project_root: Path, dry_run: bool = False, force: bool = False):
|
|
28
23
|
"""Initialize ScaffoldManager.
|
|
@@ -388,11 +383,12 @@ server:
|
|
|
388
383
|
return
|
|
389
384
|
|
|
390
385
|
# Append X-IPE entries
|
|
391
|
-
if
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
386
|
+
if self.GITIGNORE_ENTRIES:
|
|
387
|
+
if not content.endswith("\n"):
|
|
388
|
+
content += "\n"
|
|
389
|
+
content += "\n".join(self.GITIGNORE_ENTRIES)
|
|
390
|
+
gitignore_path.write_text(content)
|
|
391
|
+
self.created.append(gitignore_path)
|
|
396
392
|
|
|
397
393
|
def scaffold_all(self) -> Tuple[List[Path], List[Path]]:
|
|
398
394
|
"""Run all scaffolding operations.
|
|
@@ -401,7 +397,6 @@ server:
|
|
|
401
397
|
Tuple of (created_paths, skipped_paths).
|
|
402
398
|
"""
|
|
403
399
|
self.create_docs_structure()
|
|
404
|
-
self.create_runtime_folder()
|
|
405
400
|
self.copy_skills()
|
|
406
401
|
self.copy_copilot_instructions()
|
|
407
402
|
self.copy_mcp_config()
|
|
@@ -409,7 +404,6 @@ server:
|
|
|
409
404
|
self.copy_planning_templates()
|
|
410
405
|
self.copy_themes()
|
|
411
406
|
self.create_config_file()
|
|
412
|
-
self.update_gitignore()
|
|
413
407
|
self.merge_mcp_config()
|
|
414
408
|
return self.get_summary()
|
|
415
409
|
|
|
@@ -430,6 +430,17 @@ class WorkplaceManager {
|
|
|
430
430
|
this.downloadFile(node.path, node.name);
|
|
431
431
|
});
|
|
432
432
|
actionBtns.appendChild(downloadBtn);
|
|
433
|
+
|
|
434
|
+
// Rename button for files
|
|
435
|
+
const renameBtn = document.createElement('button');
|
|
436
|
+
renameBtn.className = 'workplace-tree-action-btn workplace-tree-rename-btn';
|
|
437
|
+
renameBtn.innerHTML = '<i class="bi bi-pencil"></i>';
|
|
438
|
+
renameBtn.title = 'Rename file';
|
|
439
|
+
renameBtn.addEventListener('click', (e) => {
|
|
440
|
+
e.stopPropagation();
|
|
441
|
+
this.startFileRename(li, node.path, node.name);
|
|
442
|
+
});
|
|
443
|
+
actionBtns.appendChild(renameBtn);
|
|
433
444
|
}
|
|
434
445
|
|
|
435
446
|
// Delete button
|
|
@@ -4,12 +4,12 @@ x_ipe/app.py,sha256=EkOYKxF-nKnRG2ev6tC-Fw5EHikWJyVxO7hfLAouJPE,5262
|
|
|
4
4
|
x_ipe/app.py.bak,sha256=WRuPkrHkS77BAMFYV5uVS2Xl2-QDwQE0KdgTyJHxMpk,45732
|
|
5
5
|
x_ipe/config.py,sha256=NYLhpfhxVMZETHW2SNej3sVoUutuPzTGrQTsJTuie80,1685
|
|
6
6
|
x_ipe/cli/__init__.py,sha256=yAg0J4ULFDPnVbtFOORPAcWT_SwjW4CK9bNDd-c2xPg,80
|
|
7
|
-
x_ipe/cli/main.py,sha256=
|
|
7
|
+
x_ipe/cli/main.py,sha256=07MEkeGHsvUSKarqJ3dy4tsD0-ZNDgxj4VKGddkivdk,16792
|
|
8
8
|
x_ipe/core/__init__.py,sha256=aB6UCmjC3QRrJfHPTV0uBqGHnnnQncX6rl4i6PKI5oo,556
|
|
9
9
|
x_ipe/core/config.py,sha256=9JmWcVqBvfcqwkWnfx4WvmSi65JVnfhERE5w6pBZSRI,5590
|
|
10
10
|
x_ipe/core/hashing.py,sha256=brF5W8fHZVxADkRqztoBg9yNkN8PpbLI7WWrsRY54Zg,3573
|
|
11
11
|
x_ipe/core/paths.py,sha256=bTXouYy0-_k7A1mNaRg2MLWnfDuzZesPlsY9Rg6nMOo,2562
|
|
12
|
-
x_ipe/core/scaffold.py,sha256=
|
|
12
|
+
x_ipe/core/scaffold.py,sha256=tc7QfRMSsZpDUndIpQ-1XBMY9zVfr9UZ4M_HMaPi6MY,15032
|
|
13
13
|
x_ipe/core/skills.py,sha256=sZSk-eDLYxvpa9J1a7HIv3xuwrDLinvL7tLIcmTXixc,8535
|
|
14
14
|
x_ipe/handlers/__init__.py,sha256=asR3VNYqVYbOowET6Nxn82S7hM52ySEuCmqAaKaZ78E,359
|
|
15
15
|
x_ipe/handlers/terminal_handlers.py,sha256=1vc34FAdaBL2J_wi3BSlGKw6HmWADXf83O-ECTO8Ov0,4463
|
|
@@ -85,7 +85,7 @@ x_ipe/static/js/features/project-switcher.js,sha256=PpmOBkUHnl508OmywDPJqqM9AZ7j
|
|
|
85
85
|
x_ipe/static/js/features/sidebar.js,sha256=00NCOzIRS7zsaXytFCG2tquFDmglywNkE89L3ImeWUU,30703
|
|
86
86
|
x_ipe/static/js/features/stage-toolbox.js,sha256=sAztFeGFBzgvIXO0jdw6XK2kwd5CieJV3ULcm50umHQ,22621
|
|
87
87
|
x_ipe/static/js/features/voice-input.js,sha256=5YpvtfhlwPWcDZqstaszOP3BfKQyy-oOF84ZPyGtSSQ,16247
|
|
88
|
-
x_ipe/static/js/features/workplace.js,sha256=
|
|
88
|
+
x_ipe/static/js/features/workplace.js,sha256=AIL-exn6YMprqGhr16oDX5CY-QWZrbrqsJ7Mg-z9Bps,88593
|
|
89
89
|
x_ipe/static/js/lib/architecture-dsl/bundle.js,sha256=QwOewNVc5Vi8dEYS6mXG4l3HFbmD9UZ_wTOBTzvDBP4,28961
|
|
90
90
|
x_ipe/static/js/lib/architecture-dsl/html-renderer.js,sha256=I1b17Lo6Rhc5xg28dIK7CcB5G-LCuTSjne1dZU6j6es,18405
|
|
91
91
|
x_ipe/static/js/lib/architecture-dsl/index.js,sha256=KlrxsSYtevthcm_qPszEGiZpMJ73okKne66zncpSlms,5039
|
|
@@ -1244,8 +1244,8 @@ x_ipe/resources/skills/x-ipe-skill-creator/templates/references/examples.md,sha2
|
|
|
1244
1244
|
x_ipe/resources/skills/xlsx/LICENSE.txt,sha256=efbY9bQnJS-jscEezb22v2ELlE91MLTeePdw84dBz6o,1467
|
|
1245
1245
|
x_ipe/resources/skills/xlsx/SKILL.md,sha256=AgzNtZMiV7ZsY47BFX6iSNV_pSyMAfH2i1WbWXDH3zU,10632
|
|
1246
1246
|
x_ipe/resources/skills/xlsx/recalc.py,sha256=qx7wyUU2uyO2xqPTJ2mwQB7DzIXnPCR9V03YTsc68V0,6408
|
|
1247
|
-
x_ipe-1.0.
|
|
1248
|
-
x_ipe-1.0.
|
|
1249
|
-
x_ipe-1.0.
|
|
1250
|
-
x_ipe-1.0.
|
|
1251
|
-
x_ipe-1.0.
|
|
1247
|
+
x_ipe-1.0.23.dist-info/METADATA,sha256=7HgCDMaazBfNapmbElkyHVgUwFYOJ0-m0Ns_6AJaR9s,637
|
|
1248
|
+
x_ipe-1.0.23.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
1249
|
+
x_ipe-1.0.23.dist-info/entry_points.txt,sha256=b787rsvZAIjLgjBzB87D_BE8yu6DCqBqv9zv4F6_j6M,41
|
|
1250
|
+
x_ipe-1.0.23.dist-info/licenses/LICENSE,sha256=8lS-M88bBvSI9_8kauYvQRu03WEMnj1Q5KoxOFKFnhc,1062
|
|
1251
|
+
x_ipe-1.0.23.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|