x-ipe 1.0.21__py3-none-any.whl → 1.0.22__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 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
- return
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 local_skills:
440
- click.echo(f"Local skills: {len(local_skills)}")
441
- if modified:
442
- click.echo(f"Modified skills: {len(modified)}")
443
-
444
- # Filter by specific skill if requested
445
- if skill:
446
- package_skills = [s for s in package_skills if s.name == skill]
447
- if not package_skills:
448
- click.echo(f"\nError: Skill '{skill}' not found in package.")
449
- raise click.Abort()
450
- click.echo(f"\nUpgrading skill: {skill}")
451
-
452
- # Check for modifications that would be overwritten
453
- skills_to_warn = []
454
- if not force:
455
- for pkg_skill in package_skills:
456
- local_skill = skills_manager.get_skill_info(pkg_skill.name)
457
- if local_skill and local_skill.source == "local" and local_skill.modified:
458
- skills_to_warn.append(local_skill)
459
-
460
- if skills_to_warn:
461
- click.echo(f"\nThe following skills have local modifications:")
462
- for s in skills_to_warn:
463
- click.echo(f" {s.name}")
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
- if not force:
467
- if not click.confirm("\nOverwrite modified skills?"):
468
- click.echo("Aborted.")
469
- return
470
-
471
- if dry_run:
472
- click.echo("\nDry run - would sync:")
473
- for pkg_skill in package_skills:
474
- click.echo(f" → {pkg_skill.name}")
475
- click.echo("\nRun without --dry-run to apply changes.")
476
- return
477
-
478
- # Perform the sync
479
- synced = skills_manager.sync_from_package(
480
- skill_name=skill,
481
- backup=backup
482
- )
483
-
484
- if synced:
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 not content.endswith("\n"):
392
- content += "\n"
393
- content += "\n".join(self.GITIGNORE_ENTRIES)
394
- gitignore_path.write_text(content)
395
- self.created.append(gitignore_path)
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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: x-ipe
3
- Version: 1.0.21
3
+ Version: 1.0.22
4
4
  Summary: X-IPE: AI-powered development framework
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -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=NA0Fn7t6tjrYczASydcE0qPsA-y89pYPxBv8faiyURs,16596
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=64jB8jYmm9oU_7l3PUjRzLyudb8NxZ9mDwgHb8WytVI,15107
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
@@ -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.21.dist-info/METADATA,sha256=oknwRHE940fbvhPbPU1g4GA-bJX5gSV_mqhZmPE8Huo,637
1248
- x_ipe-1.0.21.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
1249
- x_ipe-1.0.21.dist-info/entry_points.txt,sha256=b787rsvZAIjLgjBzB87D_BE8yu6DCqBqv9zv4F6_j6M,41
1250
- x_ipe-1.0.21.dist-info/licenses/LICENSE,sha256=8lS-M88bBvSI9_8kauYvQRu03WEMnj1Q5KoxOFKFnhc,1062
1251
- x_ipe-1.0.21.dist-info/RECORD,,
1247
+ x_ipe-1.0.22.dist-info/METADATA,sha256=93yC-kRYsIc9w_xnXDFHPiQSGcEC-dclRpvCUqbe19o,637
1248
+ x_ipe-1.0.22.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
1249
+ x_ipe-1.0.22.dist-info/entry_points.txt,sha256=b787rsvZAIjLgjBzB87D_BE8yu6DCqBqv9zv4F6_j6M,41
1250
+ x_ipe-1.0.22.dist-info/licenses/LICENSE,sha256=8lS-M88bBvSI9_8kauYvQRu03WEMnj1Q5KoxOFKFnhc,1062
1251
+ x_ipe-1.0.22.dist-info/RECORD,,
File without changes