fornever / praefectus Goto Github PK
View Code? Open in Web Editor NEWProgrammable organizer application suite.
License: MIT License
Programmable organizer application suite.
License: MIT License
We have the a TODO in the following code:
praefectus/Praefectus.Core/Diff/Types.fs
Lines 8 to 13 in 9970a26
It should be fixed.
As discussed in #18, we'll need integration tests that directly run our binary under various conditions and test it from the outside.
As explained in the corresponding article, we currently have a problem in the diff algorithm implementation: it won't step over several empty columns in one step, which leads to some transformations not being as efficient as they could (I believe there're a couple of examples in the current tests even).
This should be fixed.
There should be a fully-fledged integration with Taskwarrior:
Depends on:
RFC link: Version Control
Praefectus should implement a simple version control system (VCS) for the information it contains. Every task should have a fully persisted change history with information about the nodes that were involved in changes.
The history should be a DAG (the same as in Git), since multiple tasks created within different "branches" could then be merged by the user into one entity.
Should every node maintain its own branch? How should import/export process cooperate with that? We'll need to solve these questions in this task.
RFC is ready, so this may be closed after finishing the initial implementation:
RFC link: Configuration
There should be a configuration system for Praefectus: the config file it reads the data location/integrations/settings from. Probably may be modelled after the Taskwarrior config (~/.task
or whatever it uses).
Depends on:
Praefectus should store its data somehow. We'll need to decide, how to implement the data storage. Points of interest:
Depends on:
Our documentation occasionally contains stale links; we should automate the cleanup process.
I want Praefectus to be able to import GitHub issues (from some scope, say, several repositories), and then export it to Taskwarrior format.
RFC link: Command Line Interface
While the UX ideas aren't finalized yet, we'll need a simple UI already on this work stage.
So, I propose to introduce some basic command line parsing and command set similar to the one of Taskwarrior, which will work with our database and will help to perform some basic task maintenance set.
It'll need to be properly documented, but I impose no requirements to finalize it right now.
Depends on:
I've coined the minimal viable implementation that's required for me to start using Praefectus. This will be called "Praefectus Prime", as the first and initial implementation, core of everything else.
It will manage tasks according to the following list of requirements:
The primary directives of Praefectus Prime are to:
The user interaction should be based on project [EXPUNGED] declassified: project Fabricator.
All other priorities suspended.
Plan:
Implement basic task management as described in the tasks RFC (#6).
Deleted
)Depends on:
The corresponding PR, #16, contains an updated task list for this issue. The list below is preserved as a historical artifact/initial task definition.
Currently, our builds are pretty heavy: for example, size of unpacked "self-contained" variant of Praefectus for Windows is about 71 MiB (and about 30 MiB if zipped with "Ultra" compression level).
One easy way to significantly decrease the package size is to publish the binaries trimmed by dotnet linker (also known as Mono linker). To do that, all we'll need is to add /p:PublishTrimmed=true
to our publish command. In my experiment, dotnet linker have decreased the unpacked application size to 30 MiB (16 MiB zipped), which is great.
It comes at a price though. Dotnet linker has its constraints, and it, by specification, may make mistakes (i.e. remove the code that is accessed at runtime, causing runtime errors when this code is called), because some of the classes/methods may be accessed in unusual way (with reflection and such). There's additional configuration that should be applied to dotnet linker in such cases.
The common recommendation for such case is to perform integration testing of resulting binaries: if these integration tests pass, then it means the binaries are good. That means, this task depends on integration test availability; we cannot publish trimmed binaries until we're sure they work well.
Good news are if we'll have the integration tests, this unblocks other significant improvements we may do with our publishing process: we may use any AOT engine, such as CoreRT, or even rewrite Praefectus in any programming language that does unit testing differently, and we'll still be able to verify the resulting binaries using our integration test suite.
Depends on:
RFC link: Tasks and Attributes
We'll need a set of the most basic task management concepts: tasks and their attributes, including:
Depends on:
As this is a project to get things done, I'd like to establish more or less formal process of new fundamental feature development.
TL;DR: this project will use tailored GitHub flow for branch/merge policy, and a simple RFC system for fundamental features in development. This issue will establish the first RFC and, successively, the first fundamental piece of documentation.
To properly utilize the NuGet lock files, we'll need to set the RestoreLockedMode
key in our build system. See the details here.
Currently, other set of NuGet packages may be resolved for building platform-dependent packages; we may choose to enforce --no-restore
on publish, and add the platform-dependent packages to the lock files.
Praefectus should have an ability to mark the tasks with tags.
There's a small feature I'd like to file to not forget about it. Probably it could be implemented in some bigger scope, when designing the scheduling system, but for now let it to just be here.
Taskwarrior periodic/recurrent tasks lack flexibility, and one particular feature I need for my schedule is to be able to schedule tasks to be performed in the last day of month (e.g. some rent payments or whatever).
When we'll be designing our scheduling system, we'll need to add this feature beyond the "basic" Taskwarrior-like feature set.
This task depends on the following:
The dependency list isn't closed, since the scheduling feature isn't planned yet.
Implement the data types from the Version Control RFC, and integrate them with the rest of the task/attribute data model.
Depends on:
Currently, diff algorithm has some manual tests, but it could still be susceptible to various kinds of problems.
I believe that a good step forward would be to add property-based tests in addition to the current diff test suite.
This issue is a milestone. It groups other issues and gives a bit of motivation for the grouping and prioritizing of them. It is expected that no work will be done in scope of the issue itself; all the work will be done in the issues it depends on.
I didn't wrote anything on this kind of issues in the process document since I expect to use them only on the start of the project, for few first releases, and they aren't important part of the RFC framework.
I want Praefectus to first interop with, and then – eventualy – surpass, the Taskwarrior in my daily routine. Taskwarrior will be the first integration Praefectus gets, and the main/flagship one (for a while, at least).
So, this release will be mostly dedicated to providing the basic infrastructure/fundamentals, and then clean interoperation mode with Taskwarrior.
Our main goals on this stage:
Essentially, I want to start using Praefectus instead of Taskwarrior at least sometimes during implementation of this milestone.
Here's a list of non-goals to clarify a bit:
Implement the Version Control validation algorithms as described in the Version Control RFC, and integrate them with the diagnostic framework created in #22.
Depends on:
One of the points of Praefectus is simple data backup and restore. We'll need a simple command that performs a backup, and another one that restores a backup.
When restoring a backup, it should try to merge the data from the backup with the actual data, and also there should be an option to completely destroy the current data and replace it with the backup.
We should take precautions to not lose everything due to the user accidentally performing a descructive backup operation: maybe disallow that on a non-empty database, or ask for additional confirmation, or perform a forced backup before destructive restore.
Depends on:
Currently we're only publishing the framework-independent packages for supported operating systems, which mean that the only external requirements for our packages are that of .NET Core itself.
It could be good for most cases, but is problematic in terms of package size: even if we apply recommendations from #18, the compressed package is still about 14 MiB, which is very significant for an application that only prints its version to the logs and does nothing else. Compressed framework-dependent package may only take 1.8 MiB.
Thus, I suggest we also publish framework-dependent package for people who have an external runtime already installed.
To do that, it's enough to pass --self-contained false
to our publish command.
We'll still publish separate packages for all the supported platforms, because the set of native libraries is different, which could create some troubles e.g. if Windows binaries are in macOS app package and require special signing procedure.
Praefectus should support working with multiple nodes. There'll be multiple node from the very beginning: there'll be a Taskwarrior node (with import/export capabilities), and a Praefectus user-facing node (so the user may customize/change the tasks imported from Taskwarrior, with the changes eventually being synchronized back to Taskwarrior).
Here're the questions we'll need to solve while designing this stuff:
Depends on:
Current task management with everything packed into attributes is too heavy to implement. I think we should scale it down to user-defined attributes, and define embedded attributes in less agnostic way. Otherwise, it seems like I develop a general-purpose database API with no actual purpose whatsoever.
In the README section “Why not Taskwarrior?”, point 9 says:
Taskwarrior has no "scopes" (e.g. for home and office work).
This isn't true: Taskwarrior has contexts, which are essentially filters that are applied automatically and that you can switch between.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.